diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 58bb5fc..ad264bd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -5,7 +5,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -119,6 +119,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -150,7 +152,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 58bb5fc..ad264bd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -5,7 +5,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -119,6 +119,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -150,7 +152,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/src/pixi/Stage.js b/src/pixi/Stage.js index 2562054..0db5d52 100644 --- a/src/pixi/Stage.js +++ b/src/pixi/Stage.js @@ -14,7 +14,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -27,6 +27,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -99,15 +100,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 58bb5fc..ad264bd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -5,7 +5,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -119,6 +119,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -150,7 +152,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/src/pixi/Stage.js b/src/pixi/Stage.js index 2562054..0db5d52 100644 --- a/src/pixi/Stage.js +++ b/src/pixi/Stage.js @@ -14,7 +14,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -27,6 +27,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -99,15 +100,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 58bb5fc..ad264bd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -5,7 +5,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -119,6 +119,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -150,7 +152,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/src/pixi/Stage.js b/src/pixi/Stage.js index 2562054..0db5d52 100644 --- a/src/pixi/Stage.js +++ b/src/pixi/Stage.js @@ -14,7 +14,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -27,6 +27,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -99,15 +100,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 58bb5fc..ad264bd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -5,7 +5,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -119,6 +119,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -150,7 +152,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/src/pixi/Stage.js b/src/pixi/Stage.js index 2562054..0db5d52 100644 --- a/src/pixi/Stage.js +++ b/src/pixi/Stage.js @@ -14,7 +14,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -27,6 +27,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -99,15 +100,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; +} + diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 58bb5fc..ad264bd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -5,7 +5,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -119,6 +119,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -150,7 +152,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/src/pixi/Stage.js b/src/pixi/Stage.js index 2562054..0db5d52 100644 --- a/src/pixi/Stage.js +++ b/src/pixi/Stage.js @@ -14,7 +14,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -27,6 +27,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -99,15 +100,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; +} + diff --git a/src/pixi/renderers/WebGLRenderer.js b/src/pixi/renderers/WebGLRenderer.js index 2089718..95d12c1 100644 --- a/src/pixi/renderers/WebGLRenderer.js +++ b/src/pixi/renderers/WebGLRenderer.js @@ -4,6 +4,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -41,7 +45,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -56,15 +60,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -73,11 +82,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -88,7 +97,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -134,55 +143,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -197,19 +157,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -219,43 +181,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -297,6 +247,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -334,285 +285,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -644,9 +317,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -733,28 +403,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 58bb5fc..ad264bd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -5,7 +5,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -119,6 +119,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -150,7 +152,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/src/pixi/Stage.js b/src/pixi/Stage.js index 2562054..0db5d52 100644 --- a/src/pixi/Stage.js +++ b/src/pixi/Stage.js @@ -14,7 +14,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -27,6 +27,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -99,15 +100,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; +} + diff --git a/src/pixi/renderers/WebGLRenderer.js b/src/pixi/renderers/WebGLRenderer.js index 2089718..95d12c1 100644 --- a/src/pixi/renderers/WebGLRenderer.js +++ b/src/pixi/renderers/WebGLRenderer.js @@ -4,6 +4,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -41,7 +45,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -56,15 +60,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -73,11 +82,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -88,7 +97,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -134,55 +143,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -197,19 +157,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -219,43 +181,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -297,6 +247,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -334,285 +285,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -644,9 +317,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -733,28 +403,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/src/pixi/textures/BaseTexture.js b/src/pixi/textures/BaseTexture.js index 763c49f..c007299 100644 --- a/src/pixi/textures/BaseTexture.js +++ b/src/pixi/textures/BaseTexture.js @@ -44,6 +44,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -77,7 +79,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/Gruntfile.js b/Gruntfile.js index d633068..d98a08f 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -29,12 +29,14 @@ '<%= dirs.src %>/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 58bb5fc..ad264bd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -5,7 +5,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -119,6 +119,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -150,7 +152,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/src/pixi/Stage.js b/src/pixi/Stage.js index 2562054..0db5d52 100644 --- a/src/pixi/Stage.js +++ b/src/pixi/Stage.js @@ -14,7 +14,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -27,6 +27,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -99,15 +100,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; +} + diff --git a/src/pixi/renderers/WebGLRenderer.js b/src/pixi/renderers/WebGLRenderer.js index 2089718..95d12c1 100644 --- a/src/pixi/renderers/WebGLRenderer.js +++ b/src/pixi/renderers/WebGLRenderer.js @@ -4,6 +4,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -41,7 +45,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -56,15 +60,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -73,11 +82,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -88,7 +97,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -134,55 +143,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -197,19 +157,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -219,43 +181,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -297,6 +247,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -334,285 +285,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -644,9 +317,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -733,28 +403,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/src/pixi/textures/BaseTexture.js b/src/pixi/textures/BaseTexture.js index 763c49f..c007299 100644 --- a/src/pixi/textures/BaseTexture.js +++ b/src/pixi/textures/BaseTexture.js @@ -44,6 +44,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -77,7 +79,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js new file mode 100644 index 0000000..f87aa73 --- /dev/null +++ b/src/pixi/textures/RenderTexture.js @@ -0,0 +1,166 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +/** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i/renderers/WebGLShaders.js', '<%= dirs.src %>/renderers/WebGLRenderer.js', '<%= dirs.src %>/renderers/WebGLBatch.js', + '<%= dirs.src %>/renderers/WebGLRenderGroup.js', '<%= dirs.src %>/renderers/CanvasRenderer.js', '<%= dirs.src %>/extras/Strip.js', '<%= dirs.src %>/extras/Rope.js', '<%= dirs.src %>/extras/TilingSprite.js', '<%= dirs.src %>/textures/BaseTexture.js', '<%= dirs.src %>/textures/Texture.js', + '<%= dirs.src %>/textures/RenderTexture.js', '<%= dirs.src %>/loaders/AssetLoader.js', '<%= dirs.src %>/loaders/SpriteSheetLoader.js', '<%= dirs.src %>/loaders/ImageLoader.js', diff --git a/bin/pixi.dev.js b/bin/pixi.dev.js index 8297a1f..e0418de 100644 --- a/bin/pixi.dev.js +++ b/bin/pixi.dev.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.rotation=0,this.alpha=1,this.visible=!0,this.cacheVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y,t[2]=this.position.x,t[5]=this.position.y;var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=e[0],u=e[1],d=e[2],l=e[3],I=e[4],p=e[5];i[0]=c*r+u*a,i[1]=c*s+u*o,i[2]=c*n+u*h+d,i[3]=l*r+I*a,i[4]=l*s+I*o,i[5]=l*n+I*h+p,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var c=this.text.charCodeAt(h);if(c!="\n".charCodeAt(0)){var u=t.chars[c];u&&(i&&u[i]&&(e.x+=u.kerning[i]),r.push({line:a,charCode:c,position:new PIXI.Point(e.x+u.xOffset,e.y+u.yOffset)}),e.x+=u.xAdvance,i=c)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var d=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),d.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+d[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target&&(this.target.view.style.cursor="default");for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(d>f&&f+I>d){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],c=r[5],u=1/(s*h+n*-o),d=h*u*i.x+-n*u*i.y+(c*n-a*h)*u,l=s*u*i.y+-o*u*i.x+(-c*s+a*o)*u,f=v.x;if(d>f&&f+v.width>d){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var m=t.children[P],X=this.hitTest(m,e);if(X)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var c=this.interactiveItems[h],u=c.__touchData;c.__hit=this.hitTest(c,n),u==n&&((c.touchend||c.tap)&&(c.__hit&&!a?(c.touchend&&c.touchend(n),c.__isDown&&c.tap&&c.tap(n),c.interactiveChildren||(a=!0)):c.__isDown&&c.touchendoutside&&c.touchendoutside(n),c.__isDown=!1),c.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],c=1/(r*o+s*-a);return new PIXI.Point(o*c*i.x+-s*c*i.y+(h*s-n*o)*c,r*c*i.y+-a*c*i.x+(-h*r+n*a)*c)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t)},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),this.__childrenRemoved.push(t),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],m=e[8];return i[0]=l*r+I*a+p*c,i[1]=l*s+I*o+p*u,i[2]=l*n+I*h+p*d,i[3]=f*r+x*a+v*c,i[4]=f*s+x*o+v*u,i[5]=f*n+x*h+v*d,i[6]=g*r+P*a+m*c,i[7]=g*s+P*o+m*u,i[8]=g*n+P*h+m*d,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],c=t[6],u=t[7],d=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],m=e[1],X=e[2],T=e[3];return i[0]=P*r+m*o+X*d+T*f,i[1]=P*s+m*h+X*l+T*x,i[2]=P*n+m*c+X*I+T*v,i[3]=P*a+m*u+X*p+T*g,P=e[4],m=e[5],X=e[6],T=e[7],i[4]=P*r+m*o+X*d+T*f,i[5]=P*s+m*h+X*l+T*x,i[6]=P*n+m*c+X*I+T*v,i[7]=P*a+m*u+X*p+T*g,P=e[8],m=e[9],X=e[10],T=e[11],i[8]=P*r+m*o+X*d+T*f,i[9]=P*s+m*h+X*l+T*x,i[10]=P*n+m*c+X*I+T*v,i[11]=P*a+m*u+X*p+T*g,P=e[12],m=e[13],X=e[14],T=e[15],i[12]=P*r+m*o+X*d+T*f,i[13]=P*s+m*h+X*l+T*x,i[14]=P*n+m*c+X*I+T*v,i[15]=P*a+m*u+X*p+T*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.prototype.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(this.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.prototype.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r],n=s.visible&&e;s.textureChange&&(s.textureChange=!1,n&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.cacheVisible!=n&&(s.cacheVisible=n,s.cacheVisible?this.addDisplayObject(s):this.removeDisplayObject(s)),s.children.length>0&&this.checkVisibility(s,n)}},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t);for(var e=0;t.__childrenRemoved.length>e;e++)this.removeDisplayObject(t.__childrenRemoved[e]);for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],this.checkVisibility(t,!0),t.updateTransform();var i=this.gl;i.clear(i.COLOR_BUFFER_BIT),i.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],0),i.blendFunc(i.ONE,i.ONE_MINUS_SRC_ALPHA),i.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);for(var r,e=0;this.batchs.length>e;e++)r=this.batchs[e],r instanceof PIXI.WebGLBatch?this.batchs[e].render():r instanceof PIXI.TilingSprite?r.visible&&this.renderTilingSprite(r):r instanceof PIXI.Strip&&r.visible&&this.renderStrip(r);if(t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.addDisplayObject=function(t){if(t.stage&&!t.__inWebGL&&(t.batch=null,t.renderable)){t.__inWebGL=!0;var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==t.stage)break}while(!e.renderable||!e.__inWebGL);var i=t;do{if(0==i.children.length){for(;i.childIndex==i.parent.children.length-1;)if(i=i.parent,i==t.stage){i=null;break}i&&(i=i.parent.children[i.childIndex+1])}else i=i.children[0];if(!i)break}while(!i.renderable||!i.__inWebGL);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=this.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=this.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderer.prototype.removeDisplayObject=function(t){if(t.cacheVisible=!1,t.renderable){t.__inWebGL=!1;var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&this.returnBatch(e),this.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&this.returnBatch(e)}}},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0+s,t.uvs[1]=0-n,t.uvs[2]=1*a+s,t.uvs[3]=0-n,t.uvs[4]=1*a+s,t.uvs[5]=1*o-n,t.uvs[6]=0+s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform); -PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0;PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSize0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context;i.globalCompositeOperation="source-over";var r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,(t.anchor.x-t.texture.trim.x)*-s.width,(t.anchor.y-t.texture.trim.y)*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n])}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],c=i[n+1],u=i[n+3],d=i[n+5];e.moveTo(a,c),e.lineTo(o,u),e.lineTo(h,d)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],c=i[a+4],u=i[a+1],d=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,u),e.lineTo(h,d),e.lineTo(c,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,m=o*v+x*c+h*g-v*c-x*h-o*g,X=I*h+o*f+p*c-h*f-o*p-I*c,T=I*v*c+x*h*f+o*p*g-o*v*f-x*p*c-I*h*g,b=u*v+x*l+d*g-v*l-x*d-u*g,y=I*d+u*f+p*l-d*f-u*p-I*l,_=I*v*l+x*d*f+u*p*g-u*v*f-x*p*l-I*d*g;e.transform(m/P,b/P,X/P,y/P,T/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,c=o/(a-1);o%2?(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1):(e[h]=c,e[h+1]=0,e[h+2]=c,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var c=10*(1-o/(a-1));c>1&&(c=1);var u=Math.sqrt(s.x*s.x+s.y*s.y),d=this.texture.height/2;s.x/=u,s.y/=u,s.x*=d,s.y*=d,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var c=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;c.length>a;a++){var u=parseInt(c[a].attributes.getNamedItem("first").nodeValue,10),d=parseInt(c[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(c[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[d].kerning[u]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file +(function(){function HEXtoRGB(t){return[(255&t>>16)/255,(255&t>>8)/255,(255&t)/255]}function determineMatrixArrayType(){return PIXI.Matrix="undefined"!=typeof Float32Array?Float32Array:Array,PIXI.Matrix}var root=this,PIXI=PIXI||{};PIXI.Point=function(t,e){this.x=t||0,this.y=e||0},PIXI.Point.clone=function(){return new PIXI.Point(this.x,this.y)},PIXI.Point.constructor=PIXI.Point,PIXI.Rectangle=function(t,e,i,r){this.x=t||0,this.y=e||0,this.width=i||0,this.height=r||0},PIXI.Rectangle.clone=function(){return new PIXI.Rectangle(this.x,this.y,this.width,this.height)},PIXI.Rectangle.constructor=PIXI.Rectangle,PIXI.DisplayObject=function(){this.position=new PIXI.Point,this.scale=new PIXI.Point(1,1),this.pivot=new PIXI.Point(0,0),this.rotation=0,this.alpha=1,this.visible=!0,this.worldVisible=!1,this.parent=null,this.stage=null,this.hitArea=null,this.worldAlpha=1,this.color=[],this.worldTransform=PIXI.mat3.create(),this.localTransform=PIXI.mat3.create(),this.dynamic=!0,this._sr=0,this._cr=1,this.renderable=!1,this.interactive=!1,this.buttonMode=!1},PIXI.DisplayObject.constructor=PIXI.DisplayObject,PIXI.DisplayObject.prototype.setInteractive=function(t){this.interactive=t,this.stage&&(this.stage.dirty=!0)},PIXI.DisplayObject.prototype.updateTransform=function(){this.rotation!=this.rotationCache&&(this.rotationCache=this.rotation,this._sr=Math.sin(this.rotation),this._cr=Math.cos(this.rotation));var t=this.localTransform,e=this.parent.worldTransform,i=this.worldTransform;t[0]=this._cr*this.scale.x,t[1]=-this._sr*this.scale.y,t[3]=this._sr*this.scale.x,t[4]=this._cr*this.scale.y;var r=this.pivot.x,s=this.pivot.y;t[2]=this.position.x-t[0]*r-s*t[1],t[5]=this.position.y-t[4]*s-r*t[3];var n=t[0],a=t[1],o=t[2],h=t[3],u=t[4],d=t[5],c=e[0],l=e[1],I=e[2],p=e[3],f=e[4],x=e[5];i[0]=c*n+l*h,i[1]=c*a+l*u,i[2]=c*o+l*d+I,i[3]=p*n+f*h,i[4]=p*a+f*u,i[5]=p*o+f*d+x,this.worldAlpha=this.alpha*this.parent.worldAlpha},PIXI.DisplayObjectContainer=function(){PIXI.DisplayObject.call(this),this.children=[],this.renderable=!1},PIXI.DisplayObjectContainer.constructor=PIXI.DisplayObjectContainer,PIXI.DisplayObjectContainer.prototype=Object.create(PIXI.DisplayObject.prototype),PIXI.DisplayObjectContainer.prototype.addChild=function(t){void 0!=t.parent&&t.parent.removeChild(t),t.parent=this,t.childIndex=this.children.length,this.children.push(t),this.stage&&this.stage.__addChild(t),this.__renderGroup&&(t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),this.__renderGroup.addDisplayObjectAndChildren(t))},PIXI.DisplayObjectContainer.prototype.addChildAt=function(t,e){if(!(e>=0&&this.children.length>=e))throw Error(t+" The index "+e+" supplied is out of bounds "+this.children.length);void 0!=t.parent&&t.parent.removeChild(t),e==this.children.length?this.children.push(t):this.children.splice(e,0,t),t.parent=this,t.childIndex=e;for(var i=this.children.length,r=e;i>r;r++)this.children[r].childIndex=r;this.stage&&this.stage.__addChild(t),this.__renderGroup&&this.__renderGroup.addDisplayObjectAndChildren(t)},PIXI.DisplayObjectContainer.prototype.swapChildren=function(t,e){var i=this.children.indexOf(t),r=this.children.indexOf(e);if(-1===i||-1===r)throw Error(t+" Both the supplied DisplayObjects must be a child of the caller "+this);this.stage&&(this.stage.__removeChild(t),this.stage.__removeChild(e),this.stage.__addChild(t),this.stage.__addChild(e)),t.childIndex=r,e.childIndex=i,this.children[i]=e,this.children[r]=t},PIXI.DisplayObjectContainer.prototype.getChildAt=function(t){if(t>=0&&this.children.length>t)return this.children[t];throw Error(child+" Both the supplied DisplayObjects must be a child of the caller "+this)},PIXI.DisplayObjectContainer.prototype.removeChild=function(t){var e=this.children.indexOf(t);if(-1===e)throw Error(t+" The supplied DisplayObject must be a child of the caller "+this);this.stage&&this.stage.__removeChild(t),t.__renderGroup&&t.__renderGroup.removeDisplayObjectAndChildren(t),t.parent=void 0,this.children.splice(e,1);for(var i=e,r=this.children.length;r>i;i++)this.children[i].childIndex-=1},PIXI.DisplayObjectContainer.prototype.updateTransform=function(){if(this.visible){PIXI.DisplayObject.prototype.updateTransform.call(this);for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform()}},PIXI.blendModes={},PIXI.blendModes.NORMAL=0,PIXI.blendModes.SCREEN=1,PIXI.Sprite=function(t){PIXI.DisplayObjectContainer.call(this),this.anchor=new PIXI.Point,this.texture=t,this.blendMode=PIXI.blendModes.NORMAL,this._width=0,this._height=0,t.baseTexture.hasLoaded?this.updateFrame=!0:(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Sprite.constructor=PIXI.Sprite,PIXI.Sprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),Object.defineProperty(PIXI.Sprite.prototype,"width",{get:function(){return this.scale.x*this.texture.frame.width},set:function(t){this.scale.x=t/this.texture.frame.width,this._width=t}}),Object.defineProperty(PIXI.Sprite.prototype,"height",{get:function(){return this.scale.y*this.texture.frame.height},set:function(t){this.scale.y=t/this.texture.frame.height,this._height=t}}),PIXI.Sprite.prototype.setTexture=function(t){this.texture.baseTexture!=t.baseTexture&&(this.textureChange=!0),this.texture=t,this.updateFrame=!0},PIXI.Sprite.prototype.onTextureUpdate=function(){this._width&&(this.scale.x=this._width/this.texture.frame.width),this._height&&(this.scale.y=this._height/this.texture.frame.height),this.updateFrame=!0},PIXI.Sprite.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache"+this);return new PIXI.Sprite(e)},PIXI.Sprite.fromImage=function(t){var e=PIXI.Texture.fromImage(t);return new PIXI.Sprite(e)},PIXI.MovieClip=function(t){PIXI.Sprite.call(this,t[0]),this.textures=t,this.currentFrame=0,this.animationSpeed=1,this.loop=!0,this.onComplete=null,this.playing},PIXI.MovieClip.constructor=PIXI.MovieClip,PIXI.MovieClip.prototype=Object.create(PIXI.Sprite.prototype),PIXI.MovieClip.prototype.stop=function(){this.playing=!1},PIXI.MovieClip.prototype.play=function(){this.playing=!0},PIXI.MovieClip.prototype.gotoAndStop=function(t){this.playing=!1,this.currentFrame=t;var e=0|this.currentFrame+.5;this.setTexture(this.textures[e%this.textures.length])},PIXI.MovieClip.prototype.gotoAndPlay=function(t){this.currentFrame=t,this.playing=!0},PIXI.MovieClip.prototype.updateTransform=function(){if(PIXI.Sprite.prototype.updateTransform.call(this),this.playing){this.currentFrame+=this.animationSpeed;var t=0|this.currentFrame+.5;this.loop||this.textures.length>t?this.setTexture(this.textures[t%this.textures.length]):t>=this.textures.length&&(this.gotoAndStop(this.textures.length-1),this.onComplete&&this.onComplete())}},PIXI.Text=function(t,e){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),PIXI.Sprite.call(this,PIXI.Texture.fromCanvas(this.canvas)),this.setText(t),this.setStyle(e),this.dirty=!0},PIXI.Text.constructor=PIXI.Text,PIXI.Text.prototype=Object.create(PIXI.Sprite.prototype),PIXI.Text.prototype.setStyle=function(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.align=t.align||"left",t.strokeThickness=t.strokeThickness||0,this.style=t,this.dirty=!0},PIXI.Sprite.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.Text.prototype.updateText=function(){this.context.font=this.style.font;for(var t=this.text.split("\n"),e=[],i=0,r=0;t.length>r;r++){var s=this.context.measureText(t[r]).width;e[r]=s,i=Math.max(i,s)}this.canvas.width=i+this.style.strokeThickness;var n=this.determineFontHeight("font: "+this.style.font+";")+this.style.strokeThickness;for(this.canvas.height=n*t.length,this.context.fillStyle=this.style.fill,this.context.font=this.style.font,this.context.strokeStyle=this.style.stroke,this.context.lineWidth=this.style.strokeThickness,this.context.textBaseline="top",r=0;t.length>r;r++){var a=new PIXI.Point(this.style.strokeThickness/2,this.style.strokeThickness/2+r*n);"right"==this.style.align?a.x+=i-e[r]:"center"==this.style.align&&(a.x+=(i-e[r])/2),this.style.stroke&&this.style.strokeThickness&&this.context.strokeText(t[r],a.x,a.y),this.style.fill&&this.context.fillText(t[r],a.x,a.y)}this.updateTexture()},PIXI.Text.prototype.updateTexture=function(){this.texture.baseTexture.width=this.canvas.width,this.texture.baseTexture.height=this.canvas.height,this.texture.frame.width=this.canvas.width,this.texture.frame.height=this.canvas.height,PIXI.texturesToUpdate.push(this.texture.baseTexture)},PIXI.Text.prototype.updateTransform=function(){this.dirty&&(this.updateText(),this.dirty=!1),PIXI.Sprite.prototype.updateTransform.call(this)},PIXI.Text.prototype.determineFontHeight=function(t){var e=PIXI.Text.heightCache[t];if(!e){var i=document.getElementsByTagName("body")[0],r=document.createElement("div"),s=document.createTextNode("M");r.appendChild(s),r.setAttribute("style",t),i.appendChild(r),e=r.offsetHeight,PIXI.Text.heightCache[t]=e,i.removeChild(r)}return e},PIXI.Text.prototype.destroy=function(t){t&&this.texture.destroy()},PIXI.Text.heightCache={},PIXI.BitmapText=function(t,e){PIXI.DisplayObjectContainer.call(this),this.setText(t),this.setStyle(e),this.updateText(),this.dirty=!1},PIXI.BitmapText.constructor=PIXI.BitmapText,PIXI.BitmapText.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.BitmapText.prototype.setText=function(t){this.text=t||" ",this.dirty=!0},PIXI.BitmapText.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",this.style=t;var e=t.font.split(" ");this.fontName=e[e.length-1],this.fontSize=e.length>=2?parseInt(e[e.length-2],10):PIXI.BitmapText.fonts[this.fontName].size,this.dirty=!0},PIXI.BitmapText.prototype.updateText=function(){for(var t=PIXI.BitmapText.fonts[this.fontName],e=new PIXI.Point,i=null,r=[],s=0,n=[],a=0,o=this.fontSize/t.size,h=0;this.text.length>h;h++){var u=this.text.charCodeAt(h);if(u!="\n".charCodeAt(0)){var d=t.chars[u];d&&(i&&d[i]&&(e.x+=d.kerning[i]),r.push({line:a,charCode:u,position:new PIXI.Point(e.x+d.xOffset,e.y+d.yOffset)}),e.x+=d.xAdvance,i=u)}else n.push(e.x),s=Math.max(s,e.x),a++,e.x=0,e.y+=t.lineHeight,i=null}n.push(e.x),s=Math.max(s,e.x);var c=[];for(h=0;a>=h;h++){var l=0;"right"==this.style.align?l=s-n[h]:"center"==this.style.align&&(l=(s-n[h])/2),c.push(l)}for(h=0;r.length>h;h++){var I=PIXI.Sprite.fromFrame(r[h].charCode);I.position.x=(r[h].position.x+c[r[h].line])*o,I.position.y=r[h].position.y*o,I.scale.x=I.scale.y=o,this.addChild(I)}this.width=e.x*o,this.height=(e.y+t.lineHeight)*o},PIXI.BitmapText.prototype.updateTransform=function(){if(this.dirty){for(;this.children.length>0;)this.removeChild(this.getChildAt(0));this.updateText(),this.dirty=!1}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)},PIXI.BitmapText.fonts={},PIXI.InteractionManager=function(t){this.stage=t,this.tempPoint=new PIXI.Point,this.mouseoverEnabled=!0,this.mouse=new PIXI.InteractionData,this.touchs={},this.pool=[],this.interactiveItems=[],this.last=0},PIXI.InteractionManager.constructor=PIXI.InteractionManager,PIXI.InteractionManager.prototype.collectInteractiveSprite=function(t,e){for(var i=t.children,r=i.length,s=r-1;s>=0;s--){var n=i[s];n.interactive?(e.interactiveChildren=!0,this.interactiveItems.push(n),n.children.length>0&&this.collectInteractiveSprite(n,n)):(n.__iParent=null,n.children.length>0&&this.collectInteractiveSprite(n,e))}},PIXI.InteractionManager.prototype.setTarget=function(t){window.navigator.msPointerEnabled&&(t.view.style["-ms-content-zooming"]="none",t.view.style["-ms-touch-action"]="none"),this.target=t,t.view.addEventListener("mousemove",this.onMouseMove.bind(this),!0),t.view.addEventListener("mousedown",this.onMouseDown.bind(this),!0),document.body.addEventListener("mouseup",this.onMouseUp.bind(this),!0),t.view.addEventListener("mouseout",this.onMouseUp.bind(this),!0),t.view.addEventListener("touchstart",this.onTouchStart.bind(this),!0),t.view.addEventListener("touchend",this.onTouchEnd.bind(this),!0),t.view.addEventListener("touchmove",this.onTouchMove.bind(this),!0)},PIXI.InteractionManager.prototype.update=function(){if(this.target){var t=Date.now(),e=t-this.last;if(e=30*e/1e3,!(1>e)){if(this.last=t,this.dirty){this.dirty=!1,this.interactiveItems.length;for(var i=0;this.interactiveItems.length>i;i++)this.interactiveItems[i].interactiveChildren=!1;this.interactiveItems=[],this.stage.interactive&&this.interactiveItems.push(this.stage),this.collectInteractiveSprite(this.stage,this.stage)}var r=this.interactiveItems.length;this.target.view.style.cursor="default";for(var i=0;r>i;i++){var s=this.interactiveItems[i];s.visible&&(s.mouseover||s.mouseout||s.buttonMode)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit?(s.buttonMode&&(this.target.view.style.cursor="pointer"),s.__isOver||(s.mouseover&&s.mouseover(this.mouse),s.__isOver=!0)):s.__isOver&&(s.mouseout&&s.mouseout(this.mouse),s.__isOver=!1))}}}},PIXI.InteractionManager.prototype.onMouseMove=function(t){t.preventDefault();var e=this.target.view.getBoundingClientRect();this.mouse.global.x=(t.clientX-e.left)*(this.target.width/e.width),this.mouse.global.y=(t.clientY-e.top)*(this.target.height/e.height);var i=this.interactiveItems.length;this.mouse.global;for(var r=0;i>r;r++){var s=this.interactiveItems[r];s.mousemove&&s.mousemove(this.mouse)}},PIXI.InteractionManager.prototype.onMouseDown=function(t){t.preventDefault();var e=this.interactiveItems.length;this.mouse.global,this.stage;for(var i=0;e>i;i++){var r=this.interactiveItems[i];if((r.mousedown||r.click)&&(r.__mouseIsDown=!0,r.__hit=this.hitTest(r,this.mouse),r.__hit&&(r.mousedown&&r.mousedown(this.mouse),r.__isDown=!0,!r.interactiveChildren)))break}},PIXI.InteractionManager.prototype.onMouseUp=function(t){t.preventDefault(),this.mouse.global;for(var e=this.interactiveItems.length,i=!1,r=0;e>r;r++){var s=this.interactiveItems[r];(s.mouseup||s.mouseupoutside||s.click)&&(s.__hit=this.hitTest(s,this.mouse),s.__hit&&!i?(s.mouseup&&s.mouseup(this.mouse),s.__isDown&&s.click&&s.click(this.mouse),s.interactiveChildren||(i=!0)):s.__isDown&&s.mouseupoutside&&s.mouseupoutside(this.mouse),s.__isDown=!1)}},PIXI.InteractionManager.prototype.hitTest=function(t,e){var i=e.global;if(!t.visible)return!1;if(t instanceof PIXI.Sprite){var r=t.worldTransform,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,I=t.texture.frame.width,p=t.texture.frame.height,f=-I*t.anchor.x;if(c>f&&f+I>c){var x=-p*t.anchor.y;if(l>x&&x+p>l)return e.target=t,!0}}else if(t.hitArea){var r=t.worldTransform,v=t.hitArea,s=r[0],n=r[1],a=r[2],o=r[3],h=r[4],u=r[5],d=1/(s*h+n*-o),c=h*d*i.x+-n*d*i.y+(u*n-a*h)*d,l=s*d*i.y+-o*d*i.x+(-u*s+a*o)*d,f=v.x;if(c>f&&f+v.width>c){var x=v.y;if(l>x&&x+v.height>l)return!0}}for(var g=t.children.length,P=0;g>P;P++){var b=t.children[P],m=this.hitTest(b,e);if(m)return!0}return!1},PIXI.InteractionManager.prototype.onTouchMove=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier];n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height)}for(var a=this.interactiveItems.length,r=0;a>r;r++){var o=this.interactiveItems[r];o.touchmove&&o.touchmove(n)}},PIXI.InteractionManager.prototype.onTouchStart=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.pool.pop();n||(n=new PIXI.InteractionData),this.touchs[s.identifier]=n,n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var a=this.interactiveItems.length,o=0;a>o;o++){var h=this.interactiveItems[o];if((h.touchstart||h.tap)&&(h.__hit=this.hitTest(h,n),h.__hit&&(h.touchstart&&h.touchstart(n),h.__isDown=!0,h.__touchData=n,!h.interactiveChildren)))break}}},PIXI.InteractionManager.prototype.onTouchEnd=function(t){t.preventDefault();for(var e=this.target.view.getBoundingClientRect(),i=t.changedTouches,r=0;i.length>r;r++){var s=i[r],n=this.touchs[s.identifier],a=!1;n.global.x=(s.clientX-e.left)*(this.target.width/e.width),n.global.y=(s.clientY-e.top)*(this.target.height/e.height);for(var o=this.interactiveItems.length,h=0;o>h;h++){var u=this.interactiveItems[h],d=u.__touchData;u.__hit=this.hitTest(u,n),d==n&&((u.touchend||u.tap)&&(u.__hit&&!a?(u.touchend&&u.touchend(n),u.__isDown&&u.tap&&u.tap(n),u.interactiveChildren||(a=!0)):u.__isDown&&u.touchendoutside&&u.touchendoutside(n),u.__isDown=!1),u.__touchData=null)}this.pool.push(n),this.touchs[s.identifier]=null}},PIXI.InteractionData=function(){this.global=new PIXI.Point,this.local=new PIXI.Point,this.target},PIXI.InteractionData.prototype.getLocalPosition=function(t){var e=t.worldTransform,i=this.global,r=e[0],s=e[1],n=e[2],a=e[3],o=e[4],h=e[5],u=1/(r*o+s*-a);return new PIXI.Point(o*u*i.x+-s*u*i.y+(h*s-n*o)*u,r*u*i.y+-a*u*i.x+(-h*r+n*a)*u)},PIXI.InteractionData.constructor=PIXI.InteractionData,PIXI.Stage=function(t,e){PIXI.DisplayObjectContainer.call(this),this.worldTransform=PIXI.mat3.create(),this.__childrenAdded=[],this.__childrenRemoved=[],this.childIndex=0,this.stage=this,this.stage.hitArea=new PIXI.Rectangle(0,0,1e5,1e5),this.interactive=!!e,this.interactionManager=new PIXI.InteractionManager(this),this.setBackgroundColor(t),this.worldVisible=!0},PIXI.Stage.constructor=PIXI.Stage,PIXI.Stage.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Stage.prototype.updateTransform=function(){this.worldAlpha=1;for(var t=0,e=this.children.length;e>t;t++)this.children[t].updateTransform();this.dirty&&(this.dirty=!1,this.interactionManager.dirty=!0),this.interactive&&this.interactionManager.update()},PIXI.Stage.prototype.setBackgroundColor=function(t){this.backgroundColor=t||0,this.backgroundColorSplit=HEXtoRGB(this.backgroundColor),this.backgroundColorString="#"+this.backgroundColor.toString(16)},PIXI.Stage.prototype.getMousePosition=function(){return this.interactionManager.mouse.global},PIXI.Stage.prototype.__addChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=this,t.children)for(var e=0;t.children.length>e;e++)this.__addChild(t.children[e])},PIXI.Stage.prototype.__removeChild=function(t){if(t.interactive&&(this.dirty=!0),t.stage=void 0,t.children)for(var e=0,i=t.children.length;i>e;e++)this.__removeChild(t.children[e])},window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),"function"!=typeof Function.prototype.bind&&(Function.prototype.bind=function(){var t=Array.prototype.slice;return function(e){function i(){var n=s.concat(t.call(arguments));r.apply(this instanceof i?this:e,n)}var r=this,s=t.call(arguments,1);if("function"!=typeof r)throw new TypeError;return i.prototype=function n(t){return t&&(n.prototype=t),this instanceof n?void 0:new n}(r.prototype),i}}());var AjaxRequest=function(){var t=["Msxml2.XMLHTTP","Microsoft.XMLHTTP"];if(!window.ActiveXObject)return window.XMLHttpRequest?new XMLHttpRequest:!1;for(var e=0;t.length>e;e++)try{return new ActiveXObject(t[e])}catch(i){}};PIXI.EventTarget=function(){var t={};this.addEventListener=this.on=function(e,i){void 0===t[e]&&(t[e]=[]),-1===t[e].indexOf(i)&&t[e].push(i)},this.dispatchEvent=this.emit=function(e){for(var i in t[e.type])t[e.type][i](e)},this.removeEventListener=this.off=function(e,i){var r=t[e].indexOf(i);-1!==r&&t[e].splice(r,1)}},determineMatrixArrayType(),PIXI.mat3={},PIXI.mat3.create=function(){var t=new PIXI.Matrix(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},PIXI.mat4={},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat3.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=e[0],I=e[1],p=e[2],f=e[3],x=e[4],v=e[5],g=e[6],P=e[7],b=e[8];return i[0]=l*r+I*a+p*u,i[1]=l*s+I*o+p*d,i[2]=l*n+I*h+p*c,i[3]=f*r+x*a+v*u,i[4]=f*s+x*o+v*d,i[5]=f*n+x*h+v*c,i[6]=g*r+P*a+b*u,i[7]=g*s+P*o+b*d,i[8]=g*n+P*h+b*c,i},PIXI.mat3.toMat4=function(t,e){return e||(e=PIXI.mat4.create()),e[15]=1,e[14]=0,e[13]=0,e[12]=0,e[11]=0,e[10]=t[8],e[9]=t[7],e[8]=t[6],e[7]=0,e[6]=t[5],e[5]=t[4],e[4]=t[3],e[3]=0,e[2]=t[2],e[1]=t[1],e[0]=t[0],e},PIXI.mat4.create=function(){var t=new PIXI.Matrix(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},PIXI.mat4.transpose=function(t,e){if(!e||t===e){var i=t[1],r=t[2],s=t[3],n=t[6],a=t[7],o=t[11];return t[1]=t[4],t[2]=t[8],t[3]=t[12],t[4]=i,t[6]=t[9],t[7]=t[13],t[8]=r,t[9]=n,t[11]=t[14],t[12]=s,t[13]=a,t[14]=o,t}return e[0]=t[0],e[1]=t[4],e[2]=t[8],e[3]=t[12],e[4]=t[1],e[5]=t[5],e[6]=t[9],e[7]=t[13],e[8]=t[2],e[9]=t[6],e[10]=t[10],e[11]=t[14],e[12]=t[3],e[13]=t[7],e[14]=t[11],e[15]=t[15],e},PIXI.mat4.multiply=function(t,e,i){i||(i=t);var r=t[0],s=t[1],n=t[2],a=t[3],o=t[4],h=t[5],u=t[6],d=t[7],c=t[8],l=t[9],I=t[10],p=t[11],f=t[12],x=t[13],v=t[14],g=t[15],P=e[0],b=e[1],m=e[2],X=e[3];return i[0]=P*r+b*o+m*c+X*f,i[1]=P*s+b*h+m*l+X*x,i[2]=P*n+b*u+m*I+X*v,i[3]=P*a+b*d+m*p+X*g,P=e[4],b=e[5],m=e[6],X=e[7],i[4]=P*r+b*o+m*c+X*f,i[5]=P*s+b*h+m*l+X*x,i[6]=P*n+b*u+m*I+X*v,i[7]=P*a+b*d+m*p+X*g,P=e[8],b=e[9],m=e[10],X=e[11],i[8]=P*r+b*o+m*c+X*f,i[9]=P*s+b*h+m*l+X*x,i[10]=P*n+b*u+m*I+X*v,i[11]=P*a+b*d+m*p+X*g,P=e[12],b=e[13],m=e[14],X=e[15],i[12]=P*r+b*o+m*c+X*f,i[13]=P*s+b*h+m*l+X*x,i[14]=P*n+b*u+m*I+X*v,i[15]=P*a+b*d+m*p+X*g,i},PIXI.autoDetectRenderer=function(t,e,i,r){t||(t=800),e||(e=600);var s=function(){try{return!!window.WebGLRenderingContext&&!!document.createElement("canvas").getContext("experimental-webgl")}catch(t){return!1}}();return s?new PIXI.WebGLRenderer(t,e,i,r):new PIXI.CanvasRenderer(t,e,i,r)},PIXI.shaderFragmentSrc=["precision mediump float;","varying vec2 vTextureCoord;","varying float vColor;","uniform sampler2D uSampler;","void main(void) {","gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y));","gl_FragColor = gl_FragColor * vColor;","}"],PIXI.shaderVertexSrc=["attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","attribute float aColor;","uniform mat4 uMVMatrix;","varying vec2 vTextureCoord;","varying float vColor;","void main(void) {","gl_Position = uMVMatrix * vec4(aVertexPosition, 1.0, 1.0);","vTextureCoord = aTextureCoord;","vColor = aColor;","}"],PIXI.CompileVertexShader=function(t,e){return PIXI._CompileShader(t,e,t.VERTEX_SHADER)},PIXI.CompileFragmentShader=function(t,e){return PIXI._CompileShader(t,e,t.FRAGMENT_SHADER)},PIXI._CompileShader=function(t,e,i){var r=e.join("\n"),s=t.createShader(i);return t.shaderSource(s,r),t.compileShader(s),t.getShaderParameter(s,t.COMPILE_STATUS)?s:(alert(t.getShaderInfoLog(s)),null)},PIXI._defaultFrame=new PIXI.Rectangle(0,0,1,1),PIXI.gl,PIXI.WebGLRenderer=function(t,e,i,r){this.transparent=!!r,this.width=t||800,this.height=e||600,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height;var s=this;this.view.addEventListener("webglcontextlost",function(t){s.handleContextLost(t)},!1),this.view.addEventListener("webglcontextrestored",function(t){s.handleContextRestored(t)},!1),this.batchs=[];try{PIXI.gl=this.gl=this.view.getContext("experimental-webgl",{alpha:this.transparent,antialias:!1,premultipliedAlpha:!0})}catch(n){throw Error(" This browser does not support webGL. Try using the canvas renderer"+this)}this.initShaders();var a=this.gl;PIXI.WebGLRenderer.gl=a,this.batch=new PIXI.WebGLBatch(a),a.disable(a.DEPTH_TEST),a.disable(a.CULL_FACE),a.enable(a.BLEND),a.colorMask(!0,!0,!0,this.transparent),this.projectionMatrix=PIXI.mat4.create(),this.resize(this.width,this.height),this.contextLost=!1,this.stageRenderGroup=new PIXI.WebGLRenderGroup(this.gl)},PIXI.WebGLRenderer.constructor=PIXI.WebGLRenderer,PIXI.WebGLRenderer.getBatch=function(){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl):PIXI._batchs.pop()},PIXI.WebGLRenderer.returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI.WebGLRenderer.prototype.initShaders=function(){var t=this.gl,e=PIXI.CompileFragmentShader(t,PIXI.shaderFragmentSrc),i=PIXI.CompileVertexShader(t,PIXI.shaderVertexSrc);this.shaderProgram=t.createProgram();var r=this.shaderProgram;t.attachShader(r,i),t.attachShader(r,e),t.linkProgram(r),t.getProgramParameter(r,t.LINK_STATUS)||alert("Could not initialise shaders"),t.useProgram(r),r.vertexPositionAttribute=t.getAttribLocation(r,"aVertexPosition"),t.enableVertexAttribArray(r.vertexPositionAttribute),r.textureCoordAttribute=t.getAttribLocation(r,"aTextureCoord"),t.enableVertexAttribArray(r.textureCoordAttribute),r.colorAttribute=t.getAttribLocation(r,"aColor"),t.enableVertexAttribArray(r.colorAttribute),r.mvMatrixUniform=t.getUniformLocation(r,"uMVMatrix"),r.samplerUniform=t.getUniformLocation(r,"uSampler"),PIXI.shaderProgram=this.shaderProgram},PIXI.WebGLRenderer.prototype.render=function(t){if(!this.contextLost){this.__stage!==t&&(this.__stage&&this.checkVisibility(this.__stage,!1),this.__stage=t,this.stageRenderGroup.setRenderable(t));for(var e=0;t.__childrenRemoved.length>e;e++){var i=t.__childrenRemoved[e].__renderGroup;i&&i.removeDisplayObject(t.__childrenRemoved[e])}for(var e=0;PIXI.texturesToUpdate.length>e;e++)this.updateTexture(PIXI.texturesToUpdate[e]);for(var e=0;PIXI.texturesToDestroy.length>e;e++)this.destroyTexture(PIXI.texturesToDestroy[e]);t.__childrenRemoved=[],t.__childrenAdded=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform();var r=this.gl;if(r.colorMask(!0,!0,!0,this.transparent),r.viewport(0,0,this.width,this.height),r.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix),r.bindFramebuffer(r.FRAMEBUFFER,null),r.clearColor(t.backgroundColorSplit[0],t.backgroundColorSplit[1],t.backgroundColorSplit[2],this.transparent),r.clear(r.COLOR_BUFFER_BIT),this.stageRenderGroup.backgroundColor=t.backgroundColorSplit,this.stageRenderGroup.render(),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0){for(var e=0;PIXI.Texture.frameUpdates.length>e;e++)PIXI.Texture.frameUpdates[e].updateFrame=!1;PIXI.Texture.frameUpdates=[]}}},PIXI.WebGLRenderer.prototype.updateTexture=function(t){var e=this.gl;t._glTexture||(t._glTexture=e.createTexture()),t.hasLoaded&&(e.bindTexture(e.TEXTURE_2D,t._glTexture),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,t.source),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),t._powerOf2?(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT)):(e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE)),e.bindTexture(e.TEXTURE_2D,null)),this.refreshBatchs=!0},PIXI.WebGLRenderer.prototype.destroyTexture=function(t){var e=this.gl;t._glTexture&&(t._glTexture=e.createTexture(),e.deleteTexture(e.TEXTURE_2D,t._glTexture))},PIXI.WebGLRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e,this.gl.viewport(0,0,this.width,this.height);var i=this.projectionMatrix;i[0]=2/this.width,i[5]=-2/this.height,i[12]=-1,i[13]=1},PIXI.WebGLRenderer.prototype.initTilingSprite=function(t){var e=this.gl;t.verticies=new Float32Array([0,0,t.width,0,t.width,t.height,0,t.height]),t.uvs=new Float32Array([0,0,1,0,1,1,0,1]),t.colors=new Float32Array([1,1,1,1]),t.indices=new Uint16Array([0,1,3,2]),t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW),t.texture.baseTexture._glTexture?(e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),t.texture.baseTexture._powerOf2=!0):t.texture.baseTexture._powerOf2=!0},PIXI.WebGLRenderer.prototype.renderTilingSprite=function(t){var e=this.gl;this.shaderProgram;var i=t.tilePosition,r=t.tileScale,s=i.x/t.texture.baseTexture.width,n=i.y/t.texture.baseTexture.height,a=t.width/t.texture.baseTexture.width/r.x,o=t.height/t.texture.baseTexture.height/r.y;t.uvs[0]=0-s,t.uvs[1]=0-n,t.uvs[2]=1*a-s,t.uvs[3]=0-n,t.uvs[4]=1*a-s,t.uvs[5]=1*o-n,t.uvs[6]=0-s,t.uvs[7]=1*o-n,e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.uvs),this.renderStrip(t)},PIXI.WebGLRenderer.prototype.initStrip=function(t){var e=this.gl;this.shaderProgram,t._vertexBuffer=e.createBuffer(),t._indexBuffer=e.createBuffer(),t._uvBuffer=e.createBuffer(),t._colorBuffer=e.createBuffer(),e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.DYNAMIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)},PIXI.WebGLRenderer.prototype.renderStrip=function(t){var e=this.gl,i=this.shaderProgram,r=PIXI.mat3.toMat4(t.worldTransform);PIXI.mat4.transpose(r),PIXI.mat4.multiply(this.projectionMatrix,r,r),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,r),t.blendMode==PIXI.blendModes.NORMAL?e.blendFunc(e.ONE,e.ONE_MINUS_SRC_ALPHA):e.blendFunc(e.ONE,e.ONE_MINUS_SRC_COLOR),t.dirty?(t.dirty=!1,e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferData(e.ARRAY_BUFFER,t.verticies,e.STATIC_DRAW),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.bufferData(e.ARRAY_BUFFER,t.uvs,e.STATIC_DRAW),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.bufferData(e.ARRAY_BUFFER,t.colors,e.STATIC_DRAW),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer),e.bufferData(e.ELEMENT_ARRAY_BUFFER,t.indices,e.STATIC_DRAW)):(e.bindBuffer(e.ARRAY_BUFFER,t._vertexBuffer),e.bufferSubData(e.ARRAY_BUFFER,0,t.verticies),e.vertexAttribPointer(i.vertexPositionAttribute,2,e.FLOAT,!1,0,0),e.bindBuffer(e.ARRAY_BUFFER,t._uvBuffer),e.vertexAttribPointer(i.textureCoordAttribute,2,e.FLOAT,!1,0,0),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,t.texture.baseTexture._glTexture),e.bindBuffer(e.ARRAY_BUFFER,t._colorBuffer),e.vertexAttribPointer(i.colorAttribute,1,e.FLOAT,!1,0,0),e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t._indexBuffer)),e.drawElements(e.TRIANGLE_STRIP,t.indices.length,e.UNSIGNED_SHORT,0),e.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix)},PIXI.WebGLRenderer.prototype.handleContextLost=function(t){t.preventDefault(),this.contextLost=!0},PIXI.WebGLRenderer.prototype.handleContextRestored=function(){this.gl=this.view.getContext("experimental-webgl",{alpha:!0}),this.initShaders();for(var t=0;PIXI.TextureCache.length>t;t++)this.updateTexture(PIXI.TextureCache[t]);for(var t=0;this.batchs.length>t;t++)this.batchs[t].restoreLostContext(this.gl),this.batchs[t].dirty=!0; +PIXI._restoreBatchs(this.gl),this.contextLost=!1},PIXI._batchs=[],PIXI._getBatch=function(t){return 0==PIXI._batchs.length?new PIXI.WebGLBatch(t):PIXI._batchs.pop()},PIXI._returnBatch=function(t){t.clean(),PIXI._batchs.push(t)},PIXI._restoreBatchs=function(t){for(var e=0;PIXI._batchs.length>e;e++)PIXI._batchs[e].restoreLostContext(t)},PIXI.WebGLBatch=function(t){this.gl=t,this.size=0,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer(),this.blendMode=PIXI.blendModes.NORMAL,this.dynamicSize=1},PIXI.WebGLBatch.constructor=PIXI.WebGLBatch,PIXI.WebGLBatch.prototype.clean=function(){this.verticies=[],this.uvs=[],this.indices=[],this.colors=[],this.dynamicSize=1,this.texture=null,this.last=null,this.size=0,this.head,this.tail},PIXI.WebGLBatch.prototype.restoreLostContext=function(t){this.gl=t,this.vertexBuffer=t.createBuffer(),this.indexBuffer=t.createBuffer(),this.uvBuffer=t.createBuffer(),this.colorBuffer=t.createBuffer()},PIXI.WebGLBatch.prototype.init=function(t){t.batch=this,this.dirty=!0,this.blendMode=t.blendMode,this.texture=t.texture.baseTexture,this.head=t,this.tail=t,this.size=1,this.growBatch()},PIXI.WebGLBatch.prototype.insertBefore=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__prev;e.__prev=t,t.__next=e,i?(t.__prev=i,i.__next=t):this.head=t},PIXI.WebGLBatch.prototype.insertAfter=function(t,e){this.size++,t.batch=this,this.dirty=!0;var i=e.__next;e.__next=t,t.__prev=e,i?(t.__next=i,i.__prev=t):this.tail=t},PIXI.WebGLBatch.prototype.remove=function(t){return this.size--,0==this.size?(t.batch=null,t.__prev=null,t.__next=null,void 0):(t.__prev?t.__prev.__next=t.__next:(this.head=t.__next,this.head.__prev=null),t.__next?t.__next.__prev=t.__prev:(this.tail=t.__prev,this.tail.__next=null),t.batch=null,t.__next=null,t.__prev=null,this.dirty=!0,void 0)},PIXI.WebGLBatch.prototype.split=function(t){this.dirty=!0;var e=new PIXI.WebGLBatch(this.gl);e.init(t),e.tail=this.tail,this.tail=t.__prev,this.tail.__next=null,t.__prev=null;for(var i=0;t;)i++,t.batch=e,t=t.__next;return e.size=i,this.size-=i,e},PIXI.WebGLBatch.prototype.merge=function(t){this.dirty=!0,this.tail.__next=t.head,t.head.__prev=this.tail,this.size+=t.size,this.tail=t.tail;for(var e=t.head;e;)e.batch=this,e=e.__next},PIXI.WebGLBatch.prototype.growBatch=function(){var t=this.gl;this.dynamicSize=1==this.size?1:1.5*this.size,this.verticies=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.vertexBuffer),t.bufferData(t.ARRAY_BUFFER,this.verticies,t.DYNAMIC_DRAW),this.uvs=new Float32Array(8*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.uvBuffer),t.bufferData(t.ARRAY_BUFFER,this.uvs,t.DYNAMIC_DRAW),this.dirtyUVS=!0,this.colors=new Float32Array(4*this.dynamicSize),t.bindBuffer(t.ARRAY_BUFFER,this.colorBuffer),t.bufferData(t.ARRAY_BUFFER,this.colors,t.DYNAMIC_DRAW),this.dirtyColors=!0,this.indices=new Uint16Array(6*this.dynamicSize);for(var e=this.indices.length/6,i=0;e>i;i++){var r=6*i,s=4*i;this.indices[r+0]=s+0,this.indices[r+1]=s+1,this.indices[r+2]=s+2,this.indices[r+3]=s+0,this.indices[r+4]=s+2,this.indices[r+5]=s+3}t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,this.indexBuffer),t.bufferData(t.ELEMENT_ARRAY_BUFFER,this.indices,t.STATIC_DRAW)},PIXI.WebGLBatch.prototype.refresh=function(){this.gl,this.dynamicSizet;t++)this.removeDisplayObjectAndChildren(this.toRemove[t]);this.toRemove=[],this.checkVisibility(this.root,this.root.visible);for(var e,t=0;this.batchs.length>t;t++)e=this.batchs[t],e instanceof PIXI.WebGLBatch?this.batchs[t].render():e instanceof PIXI.TilingSprite?e.visible&&this.renderTilingSprite(e):e instanceof PIXI.Strip&&e.visible&&this.renderStrip(e)},PIXI.WebGLRenderGroup.prototype.renderSpecific=function(t){this.gl,this.checkVisibility(t,t.visible);var e,i,r,s,n=t.renderable?t:this.getNextRenderable(t),a=n.batch;if(n instanceof PIXI.Sprite){a=n.batch;var o=a.head;if(o==n)e=0;else for(e=1;o.__next!=n;)e++,o=o.__next}else a=n;for(var h,u=t,d=t;d.children.length>0;)d=d.children[d.children.length-1],d.renderable&&(u=d);if(u instanceof PIXI.Sprite){h=u.batch;var o=h.head;if(o==u)r=0;else for(r=1;o.__next!=u;)r++,o=o.__next}else h=u;i=this.batchs.indexOf(a),s=this.batchs.indexOf(h),a instanceof PIXI.WebGLBatch?a.render(e):a instanceof PIXI.TilingSprite?a.visible&&this.renderTilingSprite(a):a instanceof PIXI.Strip&&a.visible&&this.renderStrip(a);for(var c=i+1;s>c;c++)renderable=this.batchs[c],renderable instanceof PIXI.WebGLBatch?this.batchs[c].render():renderable instanceof PIXI.TilingSprite?renderable.visible&&this.renderTilingSprite(renderable):renderable instanceof PIXI.Strip&&renderable.visible&&this.renderStrip(renderable);h instanceof PIXI.WebGLBatch?h.render(0,r+1):h instanceof PIXI.TilingSprite?h.visible&&this.renderTilingSprite(h):h instanceof PIXI.Strip&&h.visible&&this.renderStrip(h)},PIXI.WebGLRenderGroup.prototype.checkVisibility=function(t,e){for(var i=t.children,r=0;i.length>r;r++){var s=i[r];s.worldVisible=s.visible&&e,s.textureChange&&(s.textureChange=!1,s.worldVisible&&(this.removeDisplayObject(s),this.addDisplayObject(s))),s.children.length>0&&this.checkVisibility(s,s.worldVisible)}},PIXI.WebGLRenderGroup.prototype.addDisplayObject=function(t){if(t.batch=null,t.__renderGroup=this,t.renderable){var e=this.getPreviousRenderable(t),i=this.getNextRenderable(t);if(t instanceof PIXI.Sprite){var r,s;if(e instanceof PIXI.Sprite){if(r=e.batch,r&&r.texture==t.texture.baseTexture&&r.blendMode==t.blendMode)return r.insertAfter(t,e),void 0}else r=e;if(i)if(i instanceof PIXI.Sprite){if(s=i.batch){if(s.texture==t.texture.baseTexture&&s.blendMode==t.blendMode)return s.insertBefore(t,i),void 0;if(s==r){var n=r.split(i),a=PIXI.WebGLRenderer.getBatch(),o=this.batchs.indexOf(r);return a.init(t),this.batchs.splice(o+1,0,a,n),void 0}}}else s=i;var a=PIXI.WebGLRenderer.getBatch();if(a.init(t),r){var o=this.batchs.indexOf(r);this.batchs.splice(o+1,0,a)}else this.batchs.push(a)}else t instanceof PIXI.TilingSprite?(this.initTilingSprite(t),this.batchs.push(t)):t instanceof PIXI.Strip&&(this.initStrip(t),this.batchs.push(t));this.batchUpdate=!0}},PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren=function(t){this.addDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.addDisplayObjectAndChildren(e[i])},PIXI.WebGLRenderGroup.prototype.removeDisplayObject=function(t){if(t.__renderGroup=null,t.renderable){var e;if(t instanceof PIXI.Sprite){var i=t.batch;if(!i)return;i.remove(t),0==i.size&&(e=i)}else e=t;if(e){var r=this.batchs.indexOf(e);if(-1==r)return;if(0==r||r==this.batchs.length-1)return this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),void 0;if(this.batchs[r-1]instanceof PIXI.WebGLBatch&&this.batchs[r+1]instanceof PIXI.WebGLBatch&&this.batchs[r-1].texture==this.batchs[r+1].texture&&this.batchs[r-1].blendMode==this.batchs[r+1].blendMode)return this.batchs[r-1].merge(this.batchs[r+1]),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e),PIXI.WebGLRenderer.returnBatch(this.batchs[r+1]),this.batchs.splice(r,2),void 0;this.batchs.splice(r,1),e instanceof PIXI.WebGLBatch&&PIXI.WebGLRenderer.returnBatch(e)}}},PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren=function(t){if(t.__renderGroup==this){this.removeDisplayObject(t);for(var e=t.children,i=0;e.length>i;i++)this.removeDisplayObjectAndChildren(e[i])}},PIXI.WebGLRenderGroup.prototype.getNextRenderable=function(t){var e=t;do{if(0==e.children.length){for(;e.childIndex==e.parent.children.length-1;)if(e=e.parent,e==this.root){e=null;break}e&&(e=e.parent.children[e.childIndex+1])}else e=e.children[0];if(!e)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.WebGLRenderGroup.prototype.getPreviousRenderable=function(t){var e=t;do{if(0==e.childIndex)e=e.parent;else for(e=e.parent.children[e.childIndex-1];0!=e.children.length;)e=e.children[e.children.length-1];if(e==this.root)break}while(!e.renderable||!e.__renderGroup);return e},PIXI.CanvasRenderer=function(t,e,i,r){this.transparent=r,this.width=t||800,this.height=e||600,this.refresh=!0,this.view=i||document.createElement("canvas"),this.view.width=this.width,this.view.height=this.height,this.count=0,this.context=this.view.getContext("2d")},PIXI.CanvasRenderer.constructor=PIXI.CanvasRenderer,PIXI.CanvasRenderer.prototype.render=function(t){t.__childrenAdded=[],t.__childrenRemoved=[],PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],t.updateTransform(),this.view.style.backgroundColor==t.backgroundColorString||this.transparent||(this.view.style.backgroundColor=t.backgroundColorString),this.context.setTransform(1,0,0,1,0,0),this.context.clearRect(0,0,this.width,this.height),this.renderDisplayObject(t),t.interactive&&(t._interactiveEventsAdded||(t._interactiveEventsAdded=!0,t.interactionManager.setTarget(this))),PIXI.Texture.frameUpdates.length>0&&(PIXI.Texture.frameUpdates=[])},PIXI.CanvasRenderer.prototype.resize=function(t,e){this.width=t,this.height=e,this.view.width=t,this.view.height=e},PIXI.CanvasRenderer.prototype.renderDisplayObject=function(t){var e=t.worldTransform,i=this.context,r=!1;if(t.visible){if(t instanceof PIXI.Sprite){var s=t.texture.frame;s&&(i.globalAlpha=t.worldAlpha,r=!1,i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),i.drawImage(t.texture.baseTexture.source,s.x,s.y,s.width,s.height,t.anchor.x*-s.width,t.anchor.y*-s.height,s.width,s.height))}else t instanceof PIXI.Strip?(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderStrip(t)):t instanceof PIXI.TilingSprite&&(i.setTransform(e[0],e[3],e[1],e[4],e[2],e[5]),this.renderTilingSprite(t));for(var n=0;t.children.length>n;n++)this.renderDisplayObject(t.children[n]);this.context.setTransform(1,0,0,1,0,0)}},PIXI.CanvasRenderer.prototype.renderStripFlat=function(t){var e=this.context,i=t.verticies;t.uvs;var r=i.length/2;this.count++,e.beginPath();for(var s=1;r-2>s;s++){var n=2*s,a=i[n],o=i[n+2],h=i[n+4],u=i[n+1],d=i[n+3],c=i[n+5];e.moveTo(a,u),e.lineTo(o,d),e.lineTo(h,c)}e.fillStyle="#FF0000",e.fill(),e.closePath()},PIXI.CanvasRenderer.prototype.renderTilingSprite=function(t){var e=this.context;t.__tilePattern||(t.__tilePattern=e.createPattern(t.texture.baseTexture.source,"repeat")),e.beginPath();var i=t.tilePosition,r=t.tileScale;e.scale(r.x,r.y),e.translate(i.x,i.y),e.fillStyle=t.__tilePattern,e.fillRect(-i.x,-i.y,t.width/r.x,t.height/r.y),e.scale(1/r.x,1/r.y),e.translate(-i.x,-i.y),e.closePath()},PIXI.CanvasRenderer.prototype.renderStrip=function(t){var e=this.context,i=t.verticies,r=t.uvs,s=i.length/2;this.count++;for(var n=1;s-2>n;n++){var a=2*n,o=i[a],h=i[a+2],u=i[a+4],d=i[a+1],c=i[a+3],l=i[a+5],I=r[a]*t.texture.width,p=r[a+2]*t.texture.width,f=r[a+4]*t.texture.width,x=r[a+1]*t.texture.height,v=r[a+3]*t.texture.height,g=r[a+5]*t.texture.height;e.save(),e.beginPath(),e.moveTo(o,d),e.lineTo(h,c),e.lineTo(u,l),e.closePath(),e.clip();var P=I*v+x*f+p*g-v*f-x*p-I*g,b=o*v+x*u+h*g-v*u-x*h-o*g,m=I*h+o*f+p*u-h*f-o*p-I*u,X=I*v*u+x*h*f+o*p*g-o*v*f-x*p*u-I*h*g,T=d*v+x*l+c*g-v*l-x*c-d*g,y=I*c+d*f+p*l-c*f-d*p-I*l,_=I*v*l+x*c*f+d*p*g-d*v*f-x*p*l-I*c*g;e.transform(b/P,T/P,m/P,y/P,X/P,_/P),e.drawImage(t.texture.baseTexture.source,0,0),e.restore()}},PIXI.Strip=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.blendMode=PIXI.blendModes.NORMAL;try{this.uvs=new Float32Array([0,1,1,1,1,0,0,1]),this.verticies=new Float32Array([0,0,0,0,0,0,0,0,0]),this.colors=new Float32Array([1,1,1,1]),this.indices=new Uint16Array([0,1,2,3])}catch(r){this.uvs=[0,1,1,1,1,0,0,1],this.verticies=[0,0,0,0,0,0,0,0,0],this.colors=[1,1,1,1],this.indices=[0,1,2,3]}this.width=e,this.height=i,t.baseTexture.hasLoaded?(this.width=this.texture.frame.width,this.height=this.texture.frame.height,this.updateFrame=!0):(this.onTextureUpdateBind=this.onTextureUpdate.bind(this),this.texture.addEventListener("update",this.onTextureUpdateBind)),this.renderable=!0},PIXI.Strip.constructor=PIXI.Strip,PIXI.Strip.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.Strip.prototype.setTexture=function(t){this.texture=t,this.width=t.frame.width,this.height=t.frame.height,this.updateFrame=!0},PIXI.Strip.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.Rope=function(t,e){PIXI.Strip.call(this,t),this.points=e;try{this.verticies=new Float32Array(4*e.length),this.uvs=new Float32Array(4*e.length),this.colors=new Float32Array(2*e.length),this.indices=new Uint16Array(2*e.length)}catch(i){this.verticies=verticies,this.uvs=uvs,this.colors=colors,this.indices=indices}this.refresh()},PIXI.Rope.constructor=PIXI.Rope,PIXI.Rope.prototype=Object.create(PIXI.Strip.prototype),PIXI.Rope.prototype.refresh=function(){var t=this.points;if(!(1>t.length)){var e=this.uvs,i=this.indices,r=this.colors,s=t[0],n=t[0];this.count-=.2,e[0]=0,e[1]=1,e[2]=0,e[3]=1,r[0]=1,r[1]=1,i[0]=0,i[1]=1;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o,u=o/(a-1);o%2?(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1):(e[h]=u,e[h+1]=0,e[h+2]=u,e[h+3]=1),h=2*o,r[h]=1,r[h+1]=1,h=2*o,i[h]=h,i[h+1]=h+1,s=n}}},PIXI.Rope.prototype.updateTransform=function(){var t=this.points;if(!(1>t.length)){var e,i=this.verticies,r=t[0],s={x:0,y:0},n=t[0];this.count-=.2,i[0]=n.x+s.x,i[1]=n.y+s.y,i[2]=n.x-s.x,i[3]=n.y-s.y;for(var a=t.length,o=1;a>o;o++){var n=t[o],h=4*o;e=t.length-1>o?t[o+1]:n,s.y=-(e.x-r.x),s.x=e.y-r.y;var u=10*(1-o/(a-1));u>1&&(u=1);var d=Math.sqrt(s.x*s.x+s.y*s.y),c=this.texture.height/2;s.x/=d,s.y/=d,s.x*=c,s.y*=c,i[h]=n.x+s.x,i[h+1]=n.y+s.y,i[h+2]=n.x-s.x,i[h+3]=n.y-s.y,r=n}PIXI.DisplayObjectContainer.prototype.updateTransform.call(this)}},PIXI.Rope.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite=function(t,e,i){PIXI.DisplayObjectContainer.call(this),this.texture=t,this.width=e,this.height=i,this.renderable=!0,this.tileScale=new PIXI.Point(2,1),this.tilePosition=new PIXI.Point(0,0),this.blendMode=PIXI.blendModes.NORMAL},PIXI.TilingSprite.constructor=PIXI.TilingSprite,PIXI.TilingSprite.prototype=Object.create(PIXI.DisplayObjectContainer.prototype),PIXI.TilingSprite.prototype.setTexture=function(t){this.texture=t,this.updateFrame=!0},PIXI.TilingSprite.prototype.onTextureUpdate=function(){this.updateFrame=!0},PIXI.BaseTextureCache={},PIXI.texturesToUpdate=[],PIXI.texturesToDestroy=[],PIXI.BaseTexture=function(t){if(PIXI.EventTarget.call(this),this.width=100,this.height=100,this.source=t,t){if(this.source instanceof Image)if(this.source.complete)this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);else{var e=this;this.source.onload=function(){e.hasLoaded=!0,e.width=e.source.width,e.height=e.source.height,PIXI.texturesToUpdate.push(e),e.dispatchEvent({type:"loaded",content:e})}}else this.hasLoaded=!0,this.width=this.source.width,this.height=this.source.height,PIXI.texturesToUpdate.push(this);this._powerOf2=!1}},PIXI.BaseTexture.constructor=PIXI.BaseTexture,PIXI.BaseTexture.prototype.destroy=function(){this.source instanceof Image&&(this.source.src=null),this.source=null,PIXI.texturesToDestroy.push(this)},PIXI.BaseTexture.fromImage=function(t,e){var i=PIXI.BaseTextureCache[t];if(!i){var r=new Image;e&&(r.crossOrigin=""),r.src=t,i=new PIXI.BaseTexture(r),PIXI.BaseTextureCache[t]=i}return i},PIXI.TextureCache={},PIXI.FrameCache={},PIXI.Texture=function(t,e){if(PIXI.EventTarget.call(this),e||(this.noFrame=!0,e=new PIXI.Rectangle(0,0,1,1)),this.trim=new PIXI.Point,t instanceof PIXI.Texture&&(t=t.baseTexture),this.baseTexture=t,this.frame=e,this.scope=this,t.hasLoaded)this.noFrame&&(e=new PIXI.Rectangle(0,0,t.width,t.height)),this.setFrame(e);else{var i=this;t.addEventListener("loaded",function(){i.onBaseTextureLoaded()})}},PIXI.Texture.constructor=PIXI.Texture,PIXI.Texture.prototype.onBaseTextureLoaded=function(){var t=this.baseTexture;t.removeEventListener("loaded",this.onLoaded),this.noFrame&&(this.frame=new PIXI.Rectangle(0,0,t.width,t.height)),this.noFrame=!1,this.width=this.frame.width,this.height=this.frame.height,this.scope.dispatchEvent({type:"update",content:this})},PIXI.Texture.prototype.destroy=function(t){t&&this.baseTexture.destroy()},PIXI.Texture.prototype.setFrame=function(t){if(this.frame=t,this.width=t.width,this.height=t.height,t.x+t.width>this.baseTexture.width||t.y+t.height>this.baseTexture.height)throw Error("Texture Error: frame does not fit inside the base Texture dimensions "+this);this.updateFrame=!0,PIXI.Texture.frameUpdates.push(this)},PIXI.Texture.fromImage=function(t,e){var i=PIXI.TextureCache[t];return i||(i=new PIXI.Texture(PIXI.BaseTexture.fromImage(t,e)),PIXI.TextureCache[t]=i),i},PIXI.Texture.fromFrame=function(t){var e=PIXI.TextureCache[t];if(!e)throw Error("The frameId '"+t+"' does not exist in the texture cache "+this);return e},PIXI.Texture.fromCanvas=function(t){var e=new PIXI.BaseTexture(t);return new PIXI.Texture(e)},PIXI.Texture.addTextureToCache=function(t,e){PIXI.TextureCache[e]=t},PIXI.Texture.removeTextureFromCache=function(t){var e=PIXI.TextureCache[t];return PIXI.TextureCache[t]=null,e},PIXI.Texture.frameUpdates=[],PIXI.RenderTexture=function(t,e){PIXI.EventTarget.call(this),this.width=t,this.height=e,this.indetityMatrix=PIXI.mat3.create(),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),PIXI.gl?this.initWebGL():this.initCanvas()},PIXI.RenderTexture.constructor=PIXI.RenderTexture,PIXI.RenderTexture.prototype=Object.create(PIXI.Texture.prototype),PIXI.RenderTexture.prototype.initWebGL=function(){var t=PIXI.gl;this.glFramebuffer=t.createFramebuffer(),t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),this.glFramebuffer.width=this.width,this.glFramebuffer.height=this.height,this.baseTexture=new PIXI.BaseTexture,this.baseTexture.width=this.width,this.baseTexture.height=this.height,this.baseTexture._glTexture=t.createTexture(),t.bindTexture(t.TEXTURE_2D,this.baseTexture._glTexture),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.width,this.height,0,t.RGBA,t.UNSIGNED_BYTE,null),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),this.baseTexture.isRender=!0,t.bindFramebuffer(t.FRAMEBUFFER,this.glFramebuffer),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.baseTexture._glTexture,0),this.projectionMatrix=PIXI.mat4.create(),this.projectionMatrix[5]=2/this.height,this.projectionMatrix[13]=-1,this.projectionMatrix[0]=2/this.width,this.projectionMatrix[12]=-1,this.render=this.renderWebGL},PIXI.RenderTexture.prototype.initCanvas=function(){this.renderer=new PIXI.CanvasRenderer(this.width,this.height,null,0),this.baseTexture=new PIXI.BaseTexture(this.renderer.view),this.frame=new PIXI.Rectangle(0,0,this.width,this.height),this.render=this.renderCanvas},PIXI.RenderTexture.prototype.renderWebGL=function(t,e){var i=PIXI.gl;i.colorMask(!0,!0,!0,!0),i.viewport(0,0,this.width,this.height),i.bindFramebuffer(i.FRAMEBUFFER,this.glFramebuffer),e&&(i.clearColor(0,0,0,0),i.clear(i.COLOR_BUFFER_BIT)),i.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform,!1,this.projectionMatrix);var r=t.children;t.worldTransform=this.indetityMatrix;for(var s=0,n=r.length;n>s;s++)r[s].updateTransform();var a=t.__renderGroup;a?t==a.root?a.render():a.renderSpecific(t):(this.renderGroup||(this.renderGroup=new PIXI.WebGLRenderGroup(i)),this.renderGroup.setRenderable(t),this.renderGroup.render())},PIXI.RenderTexture.prototype.renderCanvas=function(t,e){var i=t.children;t.worldTransform=this.indetityMatrix;for(var r=0,s=i.length;s>r;r++)i[r].updateTransform();e&&this.renderer.context.clearRect(0,0,this.width,this.height),this.renderer.renderDisplayObject(t),PIXI.texturesToUpdate.push(this.baseTexture)},PIXI.AssetLoader=function(t){PIXI.EventTarget.call(this),this.assetURLs=t,this.crossorigin=!1,this.loadersByType={jpg:PIXI.ImageLoader,jpeg:PIXI.ImageLoader,png:PIXI.ImageLoader,gif:PIXI.ImageLoader,json:PIXI.SpriteSheetLoader,xml:PIXI.BitmapFontLoader,fnt:PIXI.BitmapFontLoader}},PIXI.AssetLoader.constructor=PIXI.AssetLoader,PIXI.AssetLoader.prototype.load=function(){var t=this;this.loadCount=this.assetURLs.length;for(var e=0;this.assetURLs.length>e;e++){var i=this.assetURLs[e],r=i.split(".").pop().toLowerCase(),s=this.loadersByType[r];if(!s)throw Error(r+" is an unsupported file type");var n=new s(i,this.crossorigin);n.addEventListener("loaded",function(){t.onAssetLoaded()}),n.load()}},PIXI.AssetLoader.prototype.onAssetLoaded=function(){this.loadCount--,this.dispatchEvent({type:"onProgress",content:this}),this.onProgress&&this.onProgress(),0==this.loadCount&&(this.dispatchEvent({type:"onComplete",content:this}),this.onComplete&&this.onComplete())},PIXI.SpriteSheetLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.frames={},this.crossorigin=e},PIXI.SpriteSheetLoader.constructor=PIXI.SpriteSheetLoader,PIXI.SpriteSheetLoader.prototype.load=function(){this.ajaxRequest=new AjaxRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onJSONLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/json"),this.ajaxRequest.send(null)},PIXI.SpriteSheetLoader.prototype.onJSONLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var jsonData=eval("("+this.ajaxRequest.responseText+")"),textureUrl=this.baseUrl+jsonData.meta.image,image=new PIXI.ImageLoader(textureUrl,this.crossorigin);this.texture=image.texture.baseTexture;var scope=this;image.addEventListener("loaded",function(){scope.onLoaded()});var frameData=jsonData.frames;for(var i in frameData){var rect=frameData[i].frame;rect&&(PIXI.TextureCache[i]=new PIXI.Texture(this.texture,{x:rect.x,y:rect.y,width:rect.w,height:rect.h}),frameData[i].trimmed&&(PIXI.TextureCache[i].realSize=frameData[i].spriteSourceSize,PIXI.TextureCache[i].trim.x=0))}image.load()}},PIXI.SpriteSheetLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.ImageLoader=function(t,e){PIXI.EventTarget.call(this),this.texture=PIXI.Texture.fromImage(t,e)},PIXI.ImageLoader.constructor=PIXI.ImageLoader,PIXI.ImageLoader.prototype.load=function(){if(this.texture.baseTexture.hasLoaded)this.onLoaded();else{var t=this;this.texture.baseTexture.addEventListener("loaded",function(){t.onLoaded()})}},PIXI.ImageLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},PIXI.BitmapFontLoader=function(t,e){PIXI.EventTarget.call(this),this.url=t,this.baseUrl=t.replace(/[^\/]*$/,""),this.texture=null,this.crossorigin=e},PIXI.BitmapFontLoader.constructor=PIXI.BitmapFontLoader,PIXI.BitmapFontLoader.prototype.load=function(){this.ajaxRequest=new XMLHttpRequest;var t=this;this.ajaxRequest.onreadystatechange=function(){t.onXMLLoaded()},this.ajaxRequest.open("GET",this.url,!0),this.ajaxRequest.overrideMimeType&&this.ajaxRequest.overrideMimeType("application/xml"),this.ajaxRequest.send(null)},PIXI.BitmapFontLoader.prototype.onXMLLoaded=function(){if(4==this.ajaxRequest.readyState&&(200==this.ajaxRequest.status||-1==window.location.href.indexOf("http"))){var t=this.baseUrl+this.ajaxRequest.responseXML.getElementsByTagName("page")[0].attributes.getNamedItem("file").nodeValue,e=new PIXI.ImageLoader(t,this.crossorigin);this.texture=e.texture.baseTexture;var i={},r=this.ajaxRequest.responseXML.getElementsByTagName("info")[0],s=this.ajaxRequest.responseXML.getElementsByTagName("common")[0];i.font=r.attributes.getNamedItem("face").nodeValue,i.size=parseInt(r.attributes.getNamedItem("size").nodeValue,10),i.lineHeight=parseInt(s.attributes.getNamedItem("lineHeight").nodeValue,10),i.chars={};for(var n=this.ajaxRequest.responseXML.getElementsByTagName("char"),a=0;n.length>a;a++){var o=parseInt(n[a].attributes.getNamedItem("id").nodeValue,10),h={x:parseInt(n[a].attributes.getNamedItem("x").nodeValue,10),y:parseInt(n[a].attributes.getNamedItem("y").nodeValue,10),width:parseInt(n[a].attributes.getNamedItem("width").nodeValue,10),height:parseInt(n[a].attributes.getNamedItem("height").nodeValue,10)};PIXI.TextureCache[o]=new PIXI.Texture(this.texture,h),i.chars[o]={xOffset:parseInt(n[a].attributes.getNamedItem("xoffset").nodeValue,10),yOffset:parseInt(n[a].attributes.getNamedItem("yoffset").nodeValue,10),xAdvance:parseInt(n[a].attributes.getNamedItem("xadvance").nodeValue,10),kerning:{}}}var u=this.ajaxRequest.responseXML.getElementsByTagName("kerning");for(a=0;u.length>a;a++){var d=parseInt(u[a].attributes.getNamedItem("first").nodeValue,10),c=parseInt(u[a].attributes.getNamedItem("second").nodeValue,10),l=parseInt(u[a].attributes.getNamedItem("amount").nodeValue,10);i.chars[c].kerning[d]=l}PIXI.BitmapText.fonts[i.font]=i;var I=this;e.addEventListener("loaded",function(){I.onLoaded()}),e.load()}},PIXI.BitmapFontLoader.prototype.onLoaded=function(){this.dispatchEvent({type:"loaded",content:this})},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=PIXI),exports.PIXI=PIXI):root.PIXI=PIXI}).call(this); \ No newline at end of file diff --git a/docs/api.js b/docs/api.js index aa7cd2e..8d486d7 100644 --- a/docs/api.js +++ b/docs/api.js @@ -14,6 +14,7 @@ "MovieClip", "Point", "Rectangle", + "RenderTexture", "Sprite", "SpriteSheetLoader", "Stage", diff --git a/docs/classes/AssetLoader.html b/docs/classes/AssetLoader.html index c6cf3d9..cda2907 100644 --- a/docs/classes/AssetLoader.html +++ b/docs/classes/AssetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BaseTexture.html b/docs/classes/BaseTexture.html index 42c09de..b96dd2b 100644 --- a/docs/classes/BaseTexture.html +++ b/docs/classes/BaseTexture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -373,7 +375,7 @@ - src/pixi/textures/BaseTexture.js:102 + src/pixi/textures/BaseTexture.js:103

    diff --git a/docs/classes/BitmapFontLoader.html b/docs/classes/BitmapFontLoader.html index ba89a2e..f92d0e3 100644 --- a/docs/classes/BitmapFontLoader.html +++ b/docs/classes/BitmapFontLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/BitmapText.html b/docs/classes/BitmapText.html index 23ba7d0..be46851 100644 --- a/docs/classes/BitmapText.html +++ b/docs/classes/BitmapText.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -493,6 +495,13 @@
  • + pivot + + + +
  • + +
  • position @@ -670,7 +679,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -769,7 +778,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -853,7 +862,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -937,7 +946,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1021,7 +1030,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1105,7 +1114,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1189,7 +1198,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1359,7 +1368,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1443,7 +1452,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1652,7 +1661,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1751,7 +1760,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1836,7 +1845,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1920,7 +1929,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2005,7 +2014,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2078,7 +2087,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2119,7 +2128,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2201,7 +2210,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2243,7 +2252,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2264,6 +2273,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2325,7 +2375,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2407,7 +2457,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2448,7 +2498,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/CanvasRenderer.html b/docs/classes/CanvasRenderer.html index 9da3303..357c338 100644 --- a/docs/classes/CanvasRenderer.html +++ b/docs/classes/CanvasRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/DisplayObject.html b/docs/classes/DisplayObject.html index f0ca27d..28a241a 100644 --- a/docs/classes/DisplayObject.html +++ b/docs/classes/DisplayObject.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -359,6 +361,13 @@
  • + pivot + + + +
  • + +
  • position @@ -602,7 +611,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -689,7 +698,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -776,7 +785,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -863,7 +872,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -950,7 +959,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1038,7 +1047,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1126,7 +1135,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1213,7 +1222,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1301,7 +1310,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1388,7 +1397,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1476,7 +1485,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1552,7 +1561,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1596,7 +1605,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -1640,7 +1649,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -1685,7 +1694,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -1706,6 +1715,50 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -1773,7 +1826,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -1861,7 +1914,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -1905,7 +1958,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/DisplayObjectContainer.html b/docs/classes/DisplayObjectContainer.html index 427d379..5554a2d 100644 --- a/docs/classes/DisplayObjectContainer.html +++ b/docs/classes/DisplayObjectContainer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -396,6 +398,13 @@
  • + pivot + + + +
  • + +
  • position @@ -579,7 +588,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -678,7 +687,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -849,7 +858,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -933,7 +942,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1017,7 +1026,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1101,7 +1110,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1274,7 +1283,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1358,7 +1367,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1451,7 +1460,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1550,7 +1559,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1804,7 +1813,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1877,7 +1886,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1918,7 +1927,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2003,7 +2012,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2045,7 +2054,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2066,6 +2075,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2127,7 +2177,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2209,7 +2259,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2250,7 +2300,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/ImageLoader.html b/docs/classes/ImageLoader.html index d8dd536..c815a20 100644 --- a/docs/classes/ImageLoader.html +++ b/docs/classes/ImageLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/InteractionData.html b/docs/classes/InteractionData.html index 0704161..faeca85 100644 --- a/docs/classes/InteractionData.html +++ b/docs/classes/InteractionData.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -186,7 +188,7 @@ - src/pixi/InteractionManager.js:513 + src/pixi/InteractionManager.js:515

    @@ -325,7 +327,7 @@ - src/pixi/InteractionManager.js:537 + src/pixi/InteractionManager.js:539

    @@ -414,7 +416,7 @@ - src/pixi/InteractionManager.js:519 + src/pixi/InteractionManager.js:521

    @@ -458,7 +460,7 @@ - src/pixi/InteractionManager.js:529 + src/pixi/InteractionManager.js:531

    diff --git a/docs/classes/InteractionManager.html b/docs/classes/InteractionManager.html index 2baa1fe..e2e128f 100644 --- a/docs/classes/InteractionManager.html +++ b/docs/classes/InteractionManager.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -148,7 +150,7 @@
    -

    The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +

    The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch.

    diff --git a/docs/classes/MovieClip.html b/docs/classes/MovieClip.html index becc1aa..f914cce 100644 --- a/docs/classes/MovieClip.html +++ b/docs/classes/MovieClip.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -512,6 +514,13 @@ +
  • + pivot + + + +
  • +
  • playing @@ -718,7 +727,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -817,7 +826,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -901,7 +910,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1159,7 +1168,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1243,7 +1252,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1327,7 +1336,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1411,7 +1420,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1496,7 +1505,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1635,7 +1644,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1719,7 +1728,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1947,7 +1956,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -2046,7 +2055,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2131,7 +2140,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2215,7 +2224,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2300,7 +2309,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2373,7 +2382,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2544,7 +2553,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2711,7 +2720,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2841,7 +2850,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2862,6 +2871,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    playing

    Boolean @@ -2967,7 +3017,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -3049,7 +3099,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -3175,7 +3225,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Point.html b/docs/classes/Point.html index fe9c94a..cb12229 100644 --- a/docs/classes/Point.html +++ b/docs/classes/Point.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Rectangle.html b/docs/classes/Rectangle.html index 5afe2c1..64d8655 100644 --- a/docs/classes/Rectangle.html +++ b/docs/classes/Rectangle.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/RenderTexture.html b/docs/classes/RenderTexture.html new file mode 100644 index 0000000..2eeb5eb --- /dev/null +++ b/docs/classes/RenderTexture.html @@ -0,0 +1,762 @@ + + + + + RenderTexture - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    RenderTexture Class

    +
    + + + +
    + Extends Texture +
    + + + + + + + + + Module: PIXI + + + + +
    + + + +
    +

    A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.

    +
    + + +
    +

    Constructor

    +
    +

    RenderTexture

    + + +
    + (
      + +
    • + + width + +
    • + +
    • + + height + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:5 + +

    + + + + + +
    + +
    + +
    + + +
    +

    Parameters:

    + +
      + +
    • + + width + Number + + + + +
      + +
      + + +
    • + +
    • + + height + Number + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + +
    + + +
    + + +
    +
    +

    Item Index

    + + +
    +

    Methods

    + + +
    + + + +
    +

    Properties

    + + +
    + + + + + +
    + + +
    +

    Methods

    + + +
    +

    fromFrame

    + + +
    + (
      + +
    • + + frameId + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:127 + +

    + + + + + +
    + +
    +

    Helper function that returns a texture based on a frame id + If the frame id is not in the texture cache an error will be thrown

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frameId + String + + + + +
      +

      The frame id of the texture

      +
      + + +
    • + +
    +
    + + + +
    +

    Returns:

    + +
    + + + Texture + +
    +
    + + + +
    + + +
    +

    render

    + + +
    + (
      + +
    • + + displayObject + +
    • + +
    • + + clear + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + + +

    + + Defined in + + + + + src/pixi/textures/RenderTexture.js:90 + +

    + + + + + +
    + +
    +

    This function will draw the display object to the texture.

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + displayObject + DisplayObject + + + + +
      + +
      + + +
    • + +
    • + + clear + Boolean + + + + +
      +

      If true the texture will not be cleared before the displayObject is drawn

      +
      + + +
    • + +
    +
    + + + + + +
    + + +
    +

    setFrame

    + + +
    + (
      + +
    • + + frame + +
    • + +
    ) +
    + + + + + + + + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:83 + +

    + + + + + +
    + +
    +

    Specifies the rectangle region of the baseTexture

    +
    + + +
    +

    Parameters:

    + +
      + +
    • + + frame + Rectangle + + + + +
      + +
      + + +
    • + +
    +
    + + + + + +
    + + +
    + + + +
    +

    Properties

    + + +
    +

    baseTexture

    + BaseTexture + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:31 + +

    + + + + +
    + +
    +

    The base texture of this texture

    +
    + + + + + + +
    + + +
    +

    frame

    + #Rectangle + + + + + + + + + +
    + + +

    Inherited from + Texture: + + + + src/pixi/textures/Texture.js:40 + +

    + + + + +
    + +
    +

    The frame specifies the region of the base texture that this texture uses

    +
    + + + + + + +
    + + +
    + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/classes/Sprite.html b/docs/classes/Sprite.html index e96a940..6b43ff6 100644 --- a/docs/classes/Sprite.html +++ b/docs/classes/Sprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -475,6 +477,13 @@
  • + pivot + + + +
  • + +
  • position @@ -666,7 +675,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -765,7 +774,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -1063,7 +1072,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1147,7 +1156,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1231,7 +1240,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1315,7 +1324,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1399,7 +1408,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1484,7 +1493,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1569,7 +1578,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1653,7 +1662,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1830,7 +1839,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1929,7 +1938,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2014,7 +2023,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2098,7 +2107,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2183,7 +2192,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2256,7 +2265,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2389,7 +2398,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2515,7 +2524,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2557,7 +2566,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2578,6 +2587,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2639,7 +2689,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2721,7 +2771,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2806,7 +2856,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/SpriteSheetLoader.html b/docs/classes/SpriteSheetLoader.html index d345bf9..f59ae41 100644 --- a/docs/classes/SpriteSheetLoader.html +++ b/docs/classes/SpriteSheetLoader.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/classes/Stage.html b/docs/classes/Stage.html index f7efaa8..b52fc6f 100644 --- a/docs/classes/Stage.html +++ b/docs/classes/Stage.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -648,7 +657,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -747,7 +756,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -831,7 +840,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -912,7 +921,7 @@ - src/pixi/Stage.js:71 + src/pixi/Stage.js:72

    @@ -986,7 +995,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1070,7 +1079,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1154,7 +1163,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1238,7 +1247,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1323,7 +1332,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1408,7 +1417,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1495,7 +1504,7 @@ - src/pixi/Stage.js:60 + src/pixi/Stage.js:61

    @@ -1579,7 +1588,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1669,7 +1678,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1768,7 +1777,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1853,7 +1862,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1937,7 +1946,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2022,7 +2031,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2099,7 +2108,7 @@ - src/pixi/Stage.js:37 + src/pixi/Stage.js:38

    @@ -2149,7 +2158,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2190,7 +2199,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2272,7 +2281,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2314,7 +2323,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2335,6 +2344,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2396,7 +2446,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2478,7 +2528,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2519,7 +2569,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Text.html b/docs/classes/Text.html index a25533f..3cbd7c6 100644 --- a/docs/classes/Text.html +++ b/docs/classes/Text.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -560,6 +562,13 @@
  • + pivot + + + +
  • + +
  • position @@ -751,7 +760,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -850,7 +859,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -934,7 +943,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -1018,7 +1027,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1102,7 +1111,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1186,7 +1195,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1270,7 +1279,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1355,7 +1364,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1440,7 +1449,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1524,7 +1533,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1867,7 +1876,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1966,7 +1975,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -2051,7 +2060,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -2135,7 +2144,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -2220,7 +2229,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -2293,7 +2302,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -2420,7 +2429,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2543,7 +2552,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2585,7 +2594,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2606,6 +2615,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2667,7 +2717,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2749,7 +2799,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2831,7 +2881,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/Texture.html b/docs/classes/Texture.html index 4d9ad5d..73ef2c9 100644 --- a/docs/classes/Texture.html +++ b/docs/classes/Texture.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -296,6 +298,8 @@ addTextureToCache + static + @@ -328,6 +332,8 @@ removeTextureFromCache + static + @@ -408,6 +414,8 @@ + static + @@ -827,6 +835,8 @@ + static + @@ -843,7 +853,7 @@ - src/pixi/textures/Texture.js:170 + src/pixi/textures/Texture.js:171

    @@ -972,7 +982,7 @@
    - +
    diff --git a/docs/classes/TilingSprite.html b/docs/classes/TilingSprite.html index 2a04606..9fe56c8 100644 --- a/docs/classes/TilingSprite.html +++ b/docs/classes/TilingSprite.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -471,6 +473,13 @@
  • + pivot + + + +
  • + +
  • position @@ -662,7 +671,7 @@ - src/pixi/DisplayObjectContainer.js:51 + src/pixi/DisplayObjectContainer.js:61

    @@ -761,7 +770,7 @@ - src/pixi/DisplayObject.js:97 + src/pixi/DisplayObject.js:104

    @@ -845,7 +854,7 @@ - src/pixi/DisplayObjectContainer.js:137 + src/pixi/DisplayObjectContainer.js:153

    @@ -929,7 +938,7 @@ - src/pixi/DisplayObject.js:103 + src/pixi/DisplayObject.js:110

    @@ -1013,7 +1022,7 @@ - src/pixi/DisplayObject.js:129 + src/pixi/DisplayObject.js:136

    @@ -1097,7 +1106,7 @@ - src/pixi/DisplayObject.js:123 + src/pixi/DisplayObject.js:130

    @@ -1181,7 +1190,7 @@ - src/pixi/DisplayObject.js:109 + src/pixi/DisplayObject.js:116

    @@ -1266,7 +1275,7 @@ - src/pixi/DisplayObject.js:116 + src/pixi/DisplayObject.js:123

    @@ -1351,7 +1360,7 @@ - src/pixi/DisplayObjectContainer.js:155 + src/pixi/DisplayObjectContainer.js:171

    @@ -1435,7 +1444,7 @@ - src/pixi/DisplayObject.js:170 + src/pixi/DisplayObject.js:177

    @@ -1525,7 +1534,7 @@ - src/pixi/DisplayObjectContainer.js:97 + src/pixi/DisplayObjectContainer.js:113

    @@ -1624,7 +1633,7 @@ - src/pixi/DisplayObject.js:140 + src/pixi/DisplayObject.js:147

    @@ -1709,7 +1718,7 @@ - src/pixi/DisplayObject.js:153 + src/pixi/DisplayObject.js:160

    @@ -1793,7 +1802,7 @@ - src/pixi/DisplayObject.js:159 + src/pixi/DisplayObject.js:166

    @@ -1878,7 +1887,7 @@ - src/pixi/DisplayObject.js:147 + src/pixi/DisplayObject.js:154

    @@ -1951,7 +1960,7 @@ - src/pixi/DisplayObject.js:33 + src/pixi/DisplayObject.js:40

    @@ -1992,7 +2001,7 @@ - src/pixi/DisplayObject.js:86 + src/pixi/DisplayObject.js:93

    @@ -2074,7 +2083,7 @@ - src/pixi/DisplayObject.js:62 + src/pixi/DisplayObject.js:69

    @@ -2116,7 +2125,7 @@ - src/pixi/DisplayObject.js:48 + src/pixi/DisplayObject.js:55

    @@ -2137,6 +2146,47 @@ +
    +

    pivot

    + Point + + + + + + + + + +
    + + +

    Inherited from + DisplayObject: + + + + src/pixi/DisplayObject.js:26 + +

    + + + + +
    + +
    +

    The pivot point of the displayObject that it rotates around

    +
    + + + + + + +
    + +

    position

    Point @@ -2198,7 +2248,7 @@ - src/pixi/DisplayObject.js:26 + src/pixi/DisplayObject.js:33

    @@ -2280,7 +2330,7 @@ - src/pixi/DisplayObject.js:55 + src/pixi/DisplayObject.js:62

    @@ -2409,7 +2459,7 @@ - src/pixi/DisplayObject.js:40 + src/pixi/DisplayObject.js:47

    diff --git a/docs/classes/WebGLBatch.html b/docs/classes/WebGLBatch.html index 902a812..9a3e238 100644 --- a/docs/classes/WebGLBatch.html +++ b/docs/classes/WebGLBatch.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -818,7 +820,7 @@ - src/pixi/renderers/WebGLBatch.js:491 + src/pixi/renderers/WebGLBatch.js:513

    diff --git a/docs/classes/WebGLRenderer.html b/docs/classes/WebGLRenderer.html index 942fa7d..89f14d0 100644 --- a/docs/classes/WebGLRenderer.html +++ b/docs/classes/WebGLRenderer.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -132,7 +134,7 @@ @@ -215,7 +217,7 @@ - src/pixi/renderers/WebGLRenderer.js:7 + src/pixi/renderers/WebGLRenderer.js:11

    @@ -401,7 +403,7 @@ - src/pixi/renderers/WebGLRenderer.js:187 + src/pixi/renderers/WebGLRenderer.js:147

    @@ -494,7 +496,7 @@ - src/pixi/renderers/WebGLRenderer.js:617 + src/pixi/renderers/WebGLRenderer.js:290

    diff --git a/docs/data.json b/docs/data.json index a4b2cb3..b7397ab 100644 --- a/docs/data.json +++ b/docs/data.json @@ -78,6 +78,13 @@ "src/pixi/renderers/WebGLBatch.js": { "name": "src/pixi/renderers/WebGLBatch.js", "modules": {}, + "classes": {}, + "fors": {}, + "namespaces": {} + }, + "src/pixi/renderers/WebGLRenderGroup.js": { + "name": "src/pixi/renderers/WebGLRenderGroup.js", + "modules": {}, "classes": { "WebGLBatch": 1 }, @@ -127,6 +134,15 @@ "fors": {}, "namespaces": {} }, + "src/pixi/textures/RenderTexture.js": { + "name": "src/pixi/textures/RenderTexture.js", + "modules": {}, + "classes": { + "RenderTexture": 1 + }, + "fors": {}, + "namespaces": {} + }, "src/pixi/textures/Texture.js": { "name": "src/pixi/textures/Texture.js", "modules": {}, @@ -270,6 +286,7 @@ "BitmapText": 1, "Text": 1, "BaseTexture": 1, + "RenderTexture": 1, "Texture": 1, "DisplayObject": 1, "DisplayObjectContainer": 1, @@ -470,8 +487,8 @@ "plugin_for": [], "extension_for": [], "module": "PIXI", - "file": "src/pixi/renderers/WebGLBatch.js", - "line": 42, + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 8, "description": "A WebGLBatch Enables a group of sprites to be drawn using the same settings.\nif a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run.", "params": [ { @@ -494,7 +511,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 7, + "line": 11, "description": "the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's\nDont forget to add the view to your DOM or you will not see anything :)", "is_constructor": 1, "params": [ @@ -649,6 +666,33 @@ } ] }, + "RenderTexture": { + "name": "RenderTexture", + "shortname": "RenderTexture", + "classitems": [], + "plugins": [], + "extensions": [], + "plugin_for": [], + "extension_for": [], + "module": "PIXI", + "file": "src/pixi/textures/RenderTexture.js", + "line": 5, + "description": "A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it.", + "extends": "Texture", + "is_constructor": 1, + "params": [ + { + "name": "width", + "description": "", + "type": "Number" + }, + { + "name": "height", + "description": "", + "type": "Number" + } + ] + }, "Texture": { "name": "Texture", "shortname": "Texture", @@ -716,7 +760,7 @@ "module": "PIXI", "file": "src/pixi/InteractionManager.js", "line": 7, - "description": "The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive.\nThis manager also supports multitouch.", + "description": "The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive\nThis manager also supports multitouch.", "is_constructor": 1, "params": [ { @@ -737,7 +781,7 @@ "extension_for": [], "module": "PIXI", "file": "src/pixi/InteractionManager.js", - "line": 513, + "line": 515, "is_constructor": 1 }, "MovieClip": { @@ -1097,7 +1141,7 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 112, + "line": 110, "description": "resizes the canvas view to the specified width and height", "params": [ { @@ -1113,28 +1157,28 @@ }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 126, + "line": 124, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 203, + "line": 205, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 238, + "line": 240, "access": "private", "tagname": "", "class": "CanvasRenderer" }, { "file": "src/pixi/renderers/CanvasRenderer.js", - "line": 267, + "line": 269, "access": "private", "tagname": "", "class": "CanvasRenderer" @@ -1301,13 +1345,26 @@ }, { "file": "src/pixi/renderers/WebGLBatch.js", - "line": 491, + "line": 513, "description": "Draws the batch to the frame buffer", "itemtype": "method", "name": "render", "class": "WebGLBatch" }, { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "WebGLBatch" + }, + { + "file": "src/pixi/renderers/WebGLRenderGroup.js", + "line": 476, + "access": "private", + "tagname": "", + "class": "WebGLBatch" + }, + { "file": "src/pixi/renderers/WebGLRenderer.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1315,35 +1372,28 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 73, + "line": 82, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 88, + "line": 97, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 98, + "line": 107, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 137, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 187, + "line": 147, "description": "Renders the stage to its webGL view", "itemtype": "method", "name": "render", @@ -1358,28 +1408,14 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 284, + "line": 234, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 337, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 540, - "access": "private", - "tagname": "", - "class": "WebGLRenderer" - }, - { - "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 617, + "line": 290, "description": "resizes the webGL view to the specified width and height", "itemtype": "method", "name": "resize", @@ -1399,42 +1435,42 @@ }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 642, + "line": 315, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 722, + "line": 392, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 762, + "line": 429, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 790, + "line": 457, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 867, + "line": 534, "access": "private", "tagname": "", "class": "WebGLRenderer" }, { "file": "src/pixi/renderers/WebGLRenderer.js", - "line": 876, + "line": 543, "access": "private", "tagname": "", "class": "WebGLRenderer" @@ -1638,7 +1674,7 @@ }, { "file": "src/pixi/textures/BaseTexture.js", - "line": 102, + "line": 103, "description": "Helper function that returns a base texture based on an image url\n If the image is not in the base texture cache it will be created and loaded", "static": 1, "itemtype": "method", @@ -1656,6 +1692,32 @@ "class": "BaseTexture" }, { + "file": "src/pixi/textures/RenderTexture.js", + "line": 1, + "author": "Mat Groves http://matgroves.com/ @Doormat23", + "class": "RenderTexture" + }, + { + "file": "src/pixi/textures/RenderTexture.js", + "line": 90, + "description": "This function will draw the display object to the texture.", + "itemtype": "method", + "name": "render", + "params": [ + { + "name": "displayObject", + "description": "", + "type": "DisplayObject" + }, + { + "name": "clear", + "description": "If true the texture will not be cleared before the displayObject is drawn", + "type": "Boolean" + } + ], + "class": "RenderTexture" + }, + { "file": "src/pixi/textures/Texture.js", "line": 1, "author": "Mat Groves http://matgroves.com/ @Doormat23", @@ -1754,6 +1816,7 @@ "file": "src/pixi/textures/Texture.js", "line": 158, "description": "Adds a texture to the textureCache.", + "static": 1, "itemtype": "method", "name": "addTextureToCache", "params": [ @@ -1772,8 +1835,9 @@ }, { "file": "src/pixi/textures/Texture.js", - "line": 170, + "line": 171, "description": "Remove a texture from the textureCache.", + "static": 1, "itemtype": "method", "name": "removeTextureFromCache", "params": [ @@ -1872,6 +1936,15 @@ { "file": "src/pixi/DisplayObject.js", "line": 26, + "description": "The pivot point of the displayObject that it rotates around", + "itemtype": "property", + "name": "pivot", + "type": "Point", + "class": "DisplayObject" + }, + { + "file": "src/pixi/DisplayObject.js", + "line": 33, "description": "The rotation of the object in radians.", "itemtype": "property", "name": "rotation", @@ -1880,7 +1953,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 33, + "line": 40, "description": "The opacity of the object.", "itemtype": "property", "name": "alpha", @@ -1889,7 +1962,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 40, + "line": 47, "description": "The visibility of the object.", "itemtype": "property", "name": "visible", @@ -1898,7 +1971,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 48, + "line": 55, "description": "[read-only] The display object container that contains this display object.", "itemtype": "property", "name": "parent", @@ -1907,7 +1980,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 55, + "line": 62, "description": "[read-only] The stage the display object is connected to, or undefined if it is not connected to the stage.", "itemtype": "property", "name": "stage", @@ -1916,7 +1989,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 62, + "line": 69, "description": "This is the defined area that will pick up mouse / touch events. It is null by default.\nSetting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children)", "itemtype": "property", "name": "hitArea", @@ -1925,7 +1998,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 86, + "line": 93, "description": "This is used to indicate if the displayObject should display a mouse hand cursor on rollover", "itemtype": "property", "name": "buttonMode", @@ -1934,7 +2007,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 97, + "line": 104, "description": "A callback that is used when the users clicks on the displayObject with their mouse", "itemtype": "method", "name": "click", @@ -1949,7 +2022,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 103, + "line": 110, "description": "A callback that is used when the user clicks the mouse down over the sprite", "itemtype": "method", "name": "mousedown", @@ -1964,7 +2037,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 109, + "line": 116, "description": "A callback that is used when the user releases the mouse that was over the displayObject\nfor this callback to be fired the mouse must have been pressed down over the displayObject", "itemtype": "method", "name": "mouseup", @@ -1979,7 +2052,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 116, + "line": 123, "description": "A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject\nfor this callback to be fired, The touch must have started over the displayObject", "itemtype": "method", "name": "mouseupoutside", @@ -1994,7 +2067,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 123, + "line": 130, "description": "A callback that is used when the users mouse rolls over the displayObject", "itemtype": "method", "name": "mouseover", @@ -2009,7 +2082,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 129, + "line": 136, "description": "A callback that is used when the users mouse leaves the displayObject", "itemtype": "method", "name": "mouseout", @@ -2024,7 +2097,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 140, + "line": 147, "description": "A callback that is used when the users taps on the sprite with their finger\nbasically a touch version of click", "itemtype": "method", "name": "tap", @@ -2039,7 +2112,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 147, + "line": 154, "description": "A callback that is used when the user touch's over the displayObject", "itemtype": "method", "name": "touchstart", @@ -2054,7 +2127,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 153, + "line": 160, "description": "A callback that is used when the user releases a touch over the displayObject", "itemtype": "method", "name": "touchend", @@ -2069,7 +2142,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 159, + "line": 166, "description": "A callback that is used when the user releases the touch that was over the displayObject\nfor this callback to be fired, The touch must have started over the sprite", "itemtype": "method", "name": "touchendoutside", @@ -2084,7 +2157,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 170, + "line": 177, "description": "Indicates if the sprite will have touch and mouse interactivity. It is false by default", "itemtype": "method", "name": "setInteractive", @@ -2099,7 +2172,7 @@ }, { "file": "src/pixi/DisplayObject.js", - "line": 184, + "line": 191, "access": "private", "tagname": "", "class": "DisplayObject" @@ -2136,7 +2209,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 51, + "line": 61, "description": "Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown", "itemtype": "method", "name": "addChildAt", @@ -2156,7 +2229,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 97, + "line": 113, "description": "Swaps the depth of 2 displayObjects", "itemtype": "method", "name": "swapChildren", @@ -2176,7 +2249,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 137, + "line": 153, "description": "Returns the Child at the specified index", "itemtype": "method", "name": "getChildAt", @@ -2191,7 +2264,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 155, + "line": 171, "description": "Removes a child from the container.", "itemtype": "method", "name": "removeChild", @@ -2206,7 +2279,7 @@ }, { "file": "src/pixi/DisplayObjectContainer.js", - "line": 184, + "line": 211, "access": "private", "tagname": "", "class": "DisplayObjectContainer" @@ -2246,7 +2319,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 519, + "line": 521, "description": "This point stores the global coords of where the touch/mouse event happened", "itemtype": "property", "name": "global", @@ -2255,7 +2328,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 529, + "line": 531, "description": "The target Sprite that was interacted with", "itemtype": "property", "name": "target", @@ -2264,7 +2337,7 @@ }, { "file": "src/pixi/InteractionManager.js", - "line": 537, + "line": 539, "description": "This will return the local coords of the specified displayObject for this InteractionData", "itemtype": "method", "name": "getLocalPosition", @@ -2631,7 +2704,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 37, + "line": 38, "itemtype": "method", "name": "updateTransform", "internal": "", @@ -2640,7 +2713,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 60, + "line": 61, "itemtype": "method", "name": "setBackgroundColor", "params": [ @@ -2655,7 +2728,7 @@ }, { "file": "src/pixi/Stage.js", - "line": 71, + "line": 72, "description": "This will return the point containing global coords of the mouse.", "itemtype": "method", "name": "getMousePosition", @@ -2682,7 +2755,7 @@ }, { "message": "unknown tag: internal", - "line": " src/pixi/Stage.js:37" + "line": " src/pixi/Stage.js:38" }, { "message": "Missing item type", @@ -2758,23 +2831,23 @@ }, { "message": "Missing item type\nresizes the canvas view to the specified width and height", - "line": " src/pixi/renderers/CanvasRenderer.js:112" + "line": " src/pixi/renderers/CanvasRenderer.js:110" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:126" + "line": " src/pixi/renderers/CanvasRenderer.js:124" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:203" + "line": " src/pixi/renderers/CanvasRenderer.js:205" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:238" + "line": " src/pixi/renderers/CanvasRenderer.js:240" }, { "message": "Missing item type", - "line": " src/pixi/renderers/CanvasRenderer.js:267" + "line": " src/pixi/renderers/CanvasRenderer.js:269" }, { "message": "Missing item type", @@ -2802,59 +2875,55 @@ }, { "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:1" + }, + { + "message": "Missing item type", + "line": " src/pixi/renderers/WebGLRenderGroup.js:476" + }, + { + "message": "Missing item type", "line": " src/pixi/renderers/WebGLRenderer.js:1" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:73" + "line": " src/pixi/renderers/WebGLRenderer.js:82" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:88" + "line": " src/pixi/renderers/WebGLRenderer.js:97" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:98" + "line": " src/pixi/renderers/WebGLRenderer.js:107" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:137" + "line": " src/pixi/renderers/WebGLRenderer.js:234" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:284" + "line": " src/pixi/renderers/WebGLRenderer.js:315" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:337" + "line": " src/pixi/renderers/WebGLRenderer.js:392" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:540" + "line": " src/pixi/renderers/WebGLRenderer.js:429" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:642" + "line": " src/pixi/renderers/WebGLRenderer.js:457" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:722" + "line": " src/pixi/renderers/WebGLRenderer.js:534" }, { "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:762" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:790" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:867" - }, - { - "message": "Missing item type", - "line": " src/pixi/renderers/WebGLRenderer.js:876" + "line": " src/pixi/renderers/WebGLRenderer.js:543" }, { "message": "Missing item type", @@ -2902,6 +2971,10 @@ }, { "message": "Missing item type", + "line": " src/pixi/textures/RenderTexture.js:1" + }, + { + "message": "Missing item type", "line": " src/pixi/textures/Texture.js:1" }, { @@ -2926,7 +2999,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObject.js:184" + "line": " src/pixi/DisplayObject.js:191" }, { "message": "Missing item type", @@ -2934,7 +3007,7 @@ }, { "message": "Missing item type", - "line": " src/pixi/DisplayObjectContainer.js:184" + "line": " src/pixi/DisplayObjectContainer.js:211" }, { "message": "Missing item type", diff --git a/docs/files/src_pixi_DisplayObject.js.html b/docs/files/src_pixi_DisplayObject.js.html index 27f0bfd..9a37f7c 100644 --- a/docs/files/src_pixi_DisplayObject.js.html +++ b/docs/files/src_pixi_DisplayObject.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -154,6 +156,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -173,7 +182,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -334,9 +343,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -354,7 +370,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } diff --git a/docs/files/src_pixi_DisplayObjectContainer.js.html b/docs/files/src_pixi_DisplayObjectContainer.js.html index f639e35..1b81a31 100644 --- a/docs/files/src_pixi_DisplayObjectContainer.js.html +++ b/docs/files/src_pixi_DisplayObjectContainer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -165,17 +167,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -215,6 +227,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -290,12 +308,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/docs/files/src_pixi_InteractionManager.js.html b/docs/files/src_pixi_InteractionManager.js.html index ced694f..a7c93ae 100644 --- a/docs/files/src_pixi_InteractionManager.js.html +++ b/docs/files/src_pixi_InteractionManager.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -135,7 +137,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -249,6 +251,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -280,7 +284,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/docs/files/src_pixi_Intro.js.html b/docs/files/src_pixi_Intro.js.html index cae108d..89cf55f 100644 --- a/docs/files/src_pixi_Intro.js.html +++ b/docs/files/src_pixi_Intro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_MovieClip.js.html b/docs/files/src_pixi_MovieClip.js.html index 38b101c..fe67a39 100644 --- a/docs/files/src_pixi_MovieClip.js.html +++ b/docs/files/src_pixi_MovieClip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Outro.js.html b/docs/files/src_pixi_Outro.js.html index af2413b..82fe979 100644 --- a/docs/files/src_pixi_Outro.js.html +++ b/docs/files/src_pixi_Outro.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Pixi.js.html b/docs/files/src_pixi_Pixi.js.html index 9a2d7fd..cb64a71 100644 --- a/docs/files/src_pixi_Pixi.js.html +++ b/docs/files/src_pixi_Pixi.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Point.js.html b/docs/files/src_pixi_Point.js.html index f7d0ba0..eb183b3 100644 --- a/docs/files/src_pixi_Point.js.html +++ b/docs/files/src_pixi_Point.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Rectangle.js.html b/docs/files/src_pixi_Rectangle.js.html index 3ef5bf7..d25b4fd 100644 --- a/docs/files/src_pixi_Rectangle.js.html +++ b/docs/files/src_pixi_Rectangle.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Sprite.js.html b/docs/files/src_pixi_Sprite.js.html index e75c3be..d7f5127 100644 --- a/docs/files/src_pixi_Sprite.js.html +++ b/docs/files/src_pixi_Sprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_Stage.js.html b/docs/files/src_pixi_Stage.js.html index 02325a1..5159d77 100644 --- a/docs/files/src_pixi_Stage.js.html +++ b/docs/files/src_pixi_Stage.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -144,7 +146,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -157,6 +159,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -229,15 +232,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i<j; i++) { - this.__removeChild(child.children[i]) + this.__removeChild(child.children[i]); } } } diff --git a/docs/files/src_pixi_extras_Rope.js.html b/docs/files/src_pixi_extras_Rope.js.html index 219f049..268caea 100644 --- a/docs/files/src_pixi_extras_Rope.js.html +++ b/docs/files/src_pixi_extras_Rope.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_Strip.js.html b/docs/files/src_pixi_extras_Strip.js.html index a7a64cd..3ccca5d 100644 --- a/docs/files/src_pixi_extras_Strip.js.html +++ b/docs/files/src_pixi_extras_Strip.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_extras_TilingSprite.js.html b/docs/files/src_pixi_extras_TilingSprite.js.html index b61c15f..b8e08fb 100644 --- a/docs/files/src_pixi_extras_TilingSprite.js.html +++ b/docs/files/src_pixi_extras_TilingSprite.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_AssetLoader.js.html b/docs/files/src_pixi_loaders_AssetLoader.js.html index 594481e..4e581f6 100644 --- a/docs/files/src_pixi_loaders_AssetLoader.js.html +++ b/docs/files/src_pixi_loaders_AssetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html index 6fd5d80..7b65e6b 100644 --- a/docs/files/src_pixi_loaders_BitmapFontLoader.js.html +++ b/docs/files/src_pixi_loaders_BitmapFontLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_ImageLoader.js.html b/docs/files/src_pixi_loaders_ImageLoader.js.html index f6fcf07..f7d86d8 100644 --- a/docs/files/src_pixi_loaders_ImageLoader.js.html +++ b/docs/files/src_pixi_loaders_ImageLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html index 3b14d2f..dd145a8 100644 --- a/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html +++ b/docs/files/src_pixi_loaders_SpriteSheetLoader.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_renderers_CanvasRenderer.js.html b/docs/files/src_pixi_renderers_CanvasRenderer.js.html index 0b91b46..2b9cf49 100644 --- a/docs/files/src_pixi_renderers_CanvasRenderer.js.html +++ b/docs/files/src_pixi_renderers_CanvasRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -209,14 +211,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -260,7 +260,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -297,14 +297,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -327,7 +331,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** diff --git a/docs/files/src_pixi_renderers_WebGLBatch.js.html b/docs/files/src_pixi_renderers_WebGLBatch.js.html index 95b86b5..645034e 100644 --- a/docs/files/src_pixi_renderers_WebGLBatch.js.html +++ b/docs/files/src_pixi_renderers_WebGLBatch.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -544,73 +546,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -622,8 +646,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -636,16 +665,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -680,9 +703,13 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); } diff --git a/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html new file mode 100644 index 0000000..47e0dbd --- /dev/null +++ b/docs/files/src_pixi_renderers_WebGLRenderGroup.js.html @@ -0,0 +1,708 @@ + + + + + src/pixi/renderers/WebGLRenderGroup.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/renderers/WebGLRenderGroup.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +
    +
    +
    +/**
    + * A WebGLBatch Enables a group of sprites to be drawn using the same settings.
    + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. 
    + * @class WebGLBatch
    + * @param an instance of the webGL context
    + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch}
    + */
    +PIXI.WebGLRenderGroup = function(gl)
    +{
    +	this.gl = gl;
    +	this.root;
    +	
    +	this.backgroundColor;
    +	this.batchs = [];
    +	this.toRemove = [];
    +}
    +
    +
    +// constructor
    +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup;
    +
    +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject)
    +{
    +	// has this changed??
    +	if(this.root)this.removeDisplayObjectAndChildren(this.root);
    +	
    +	//console.log("!!!");
    +	// TODO what if its already has an object? should remove it
    +	this.root = displayObject;
    +	//displayObject.__renderGroup = this;
    +	this.addDisplayObjectAndChildren(displayObject);
    +	//displayObject
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture)
    +{
    +	
    +	var gl = this.gl;
    +	
    +	for (var i=0; i < this.toRemove.length; i++) 
    +	{
    +		this.removeDisplayObjectAndChildren(this.toRemove[i]);
    +	};
    +	
    +	this.toRemove = [];
    +	
    +	this.checkVisibility(this.root, this.root.visible);
    +	
    +	// will render all the elements in the group
    +	var renderable;
    +	for (var i=0; i < this.batchs.length; i++) 
    +	{
    +		renderable = this.batchs[i];
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +	}
    +	
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture)
    +{
    +	var gl = this.gl;
    +	this.checkVisibility(displayObject, displayObject.visible);
    +	
    +	
    +	//console.log("SPECIFIC");
    +	// to do!
    +	// render part of the scene...
    +	
    +	var startIndex;
    +	var startBatchIndex;
    +	
    +	var endIndex;
    +	var endBatchIndex;
    +	
    +	// get NEXT Renderable!
    +	var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject);
    +	var startBatch = nextRenderable.batch;
    +	
    +	if(nextRenderable instanceof PIXI.Sprite)
    +	{
    +		startBatch = nextRenderable.batch;
    +		
    +		var head = startBatch.head;
    +		var next = head;
    +		
    +		// ok now we have the batch.. need to find the start index!
    +		if(head == nextRenderable)
    +		{
    +			startIndex = 0;
    +		}
    +		else
    +		{
    +			startIndex = 1;
    +			
    +			while(head.__next != nextRenderable)
    +			{
    +				startIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		startBatch = nextRenderable;
    +	}
    +	
    +	// Get the LAST renderable object
    +	var lastRenderable = displayObject;
    +	var endBatch;
    +	var lastItem = displayObject;
    +	while(lastItem.children.length > 0)
    +	{
    +		lastItem = lastItem.children[lastItem.children.length-1];
    +		if(lastItem.renderable)lastRenderable = lastItem;
    +	}
    +	
    +	if(lastRenderable instanceof PIXI.Sprite)
    +	{
    +		endBatch = lastRenderable.batch;
    +		
    +		var head = endBatch.head;
    +		
    +		if(head == lastRenderable)
    +		{
    +			endIndex = 0;
    +		}
    +		else
    +		{
    +			endIndex = 1;
    +			
    +			while(head.__next != lastRenderable)
    +			{
    +				endIndex++;
    +				head = head.__next;
    +			}
    +		}
    +	}
    +	else
    +	{
    +		endBatch = lastRenderable;
    +	}
    +	
    +	// now we have first and last!
    +	startBatchIndex = this.batchs.indexOf(startBatch);
    +	endBatchIndex = this.batchs.indexOf(endBatch);
    +	
    +	// DO the first batch
    +	if(startBatch instanceof PIXI.WebGLBatch)
    +	{
    +		startBatch.render(startIndex);
    +	}
    +	else if(startBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(startBatch.visible)this.renderTilingSprite(startBatch);
    +	}
    +	else if(startBatch instanceof PIXI.Strip)
    +	{
    +		if(startBatch.visible)this.renderStrip(startBatch);
    +	}
    +	
    +	// DO the middle batchs..
    +	for (var i=startBatchIndex+1; i < endBatchIndex; i++) 
    +	{
    +		renderable = this.batchs[i];
    +	
    +		if(renderable instanceof PIXI.WebGLBatch)
    +		{
    +			this.batchs[i].render();
    +		}
    +		else if(renderable instanceof PIXI.TilingSprite)
    +		{
    +			if(renderable.visible)this.renderTilingSprite(renderable);
    +		}
    +		else if(renderable instanceof PIXI.Strip)
    +		{
    +			if(renderable.visible)this.renderStrip(renderable);
    +		}
    +		
    +	}
    +	
    +	// DO the last batch..
    +	if(endBatch instanceof PIXI.WebGLBatch)
    +	{
    +		endBatch.render(0, endIndex+1);
    +	}
    +	else if(endBatch instanceof PIXI.TilingSprite)
    +	{
    +		if(endBatch.visible)this.renderTilingSprite(endBatch);
    +	}
    +	else if(endBatch instanceof PIXI.Strip)
    +	{
    +		if(endBatch.visible)this.renderStrip(endBatch);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible)
    +{
    +	// give the dp a refference to its renderGroup...
    +	var children = displayObject.children;
    +	//displayObject.worldVisible = globalVisible;
    +	for (var i=0; i < children.length; i++) 
    +	{
    +		var child = children[i];
    +		
    +		// TODO optimize... shouldt need to loop through everything all the time
    +		child.worldVisible = child.visible && globalVisible;
    +		
    +		// everything should have a batch!
    +		// time to see whats new!
    +		if(child.textureChange)
    +		{
    +			child.textureChange = false;
    +			if(child.worldVisible)
    +			{
    +				this.removeDisplayObject(child)
    +				this.addDisplayObject(child)
    +			}
    +			// update texture!!
    +		}
    +		
    +		if(child.children.length > 0)
    +		{
    +			this.checkVisibility(child, child.worldVisible);
    +		}
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject)
    +{
    +	// add a child to the render group..
    +	displayObject.batch = null;
    +	displayObject.__renderGroup = this;
    +
    +	//displayObject.cacheVisible = true;
    +	if(!displayObject.renderable)return;
    +
    +	// while looping below THE OBJECT MAY NOT HAVE BEEN ADDED
    +	//displayObject.__inWebGL = true;
    +	
    +	var previousSprite = this.getPreviousRenderable(displayObject);
    +	var nextSprite = this.getNextRenderable(displayObject);
    +	
    +
    +	/*
    +	 * so now we have the next renderable and the previous renderable
    +	 * 
    +	 */
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		var previousBatch
    +		var nextBatch
    +		
    +		//console.log( previousSprite)
    +		if(previousSprite instanceof PIXI.Sprite)
    +		{
    +			previousBatch = previousSprite.batch;
    +			if(previousBatch)
    +			{
    +				if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode)
    +				{
    +					previousBatch.insertAfter(displayObject, previousSprite);
    +					return;
    +				}
    +			}
    +		}
    +		else
    +		{
    +			// TODO reword!
    +			previousBatch = previousSprite;
    +		}
    +	
    +		if(nextSprite)
    +		{
    +			if(nextSprite instanceof PIXI.Sprite)
    +			{
    +				nextBatch = nextSprite.batch;
    +			
    +				//batch may not exist if item was added to the display list but not to the webGL
    +				if(nextBatch)
    +				{
    +					if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode)
    +					{
    +						nextBatch.insertBefore(displayObject, nextSprite);
    +						return;
    +					}
    +					else
    +					{
    +						if(nextBatch == previousBatch)
    +						{
    +							// THERE IS A SPLIT IN THIS BATCH! //
    +							var splitBatch = previousBatch.split(nextSprite);
    +							// COOL!
    +							// add it back into the array	
    +							/*
    +							 * OOPS!
    +							 * seems the new sprite is in the middle of a batch
    +							 * lets split it.. 
    +							 */
    +							var batch = PIXI.WebGLRenderer.getBatch();
    +
    +							var index = this.batchs.indexOf( previousBatch );
    +							batch.init(displayObject);
    +							this.batchs.splice(index+1, 0, batch, splitBatch);
    +							
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			else
    +			{
    +				// TODO re-word!
    +				nextBatch = nextSprite;
    +			}
    +		}
    +		
    +		/*
    +		 * looks like it does not belong to any batch!
    +		 * but is also not intersecting one..
    +		 * time to create anew one!
    +		 */
    +		
    +		var batch =  PIXI.WebGLRenderer.getBatch();
    +		batch.init(displayObject);
    +
    +		if(previousBatch) // if this is invalid it means 
    +		{
    +			var index = this.batchs.indexOf( previousBatch );
    +			this.batchs.splice(index+1, 0, batch);
    +		}
    +		else
    +		{
    +			this.batchs.push(batch);
    +		}
    +	
    +	}
    +	else if(displayObject instanceof PIXI.TilingSprite)
    +	{
    +		// add to a batch!!
    +		this.initTilingSprite(displayObject);
    +		this.batchs.push(displayObject);
    +		
    +	}
    +	else if(displayObject instanceof PIXI.Strip)
    +	{
    +		// add to a batch!!
    +		this.initStrip(displayObject);
    +		this.batchs.push(displayObject);
    +	}
    +	
    +	// if its somthing else... then custom codes!
    +	this.batchUpdate = true;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	
    +	this.addDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.addDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject)
    +{
    +	// loop through children..
    +	// display object //
    +	
    +	// add a child from the render group..
    +	// remove it and all its children!
    +	//displayObject.cacheVisible = false;//displayObject.visible;
    +	displayObject.__renderGroup = null;
    +	
    +	if(!displayObject.renderable)return;
    +	
    +	/*
    +	 * removing is a lot quicker..
    +	 * 
    +	 */
    +	var batchToRemove;
    +	
    +	if(displayObject instanceof PIXI.Sprite)
    +	{
    +		// should always have a batch!
    +		var batch = displayObject.batch;
    +		if(!batch)return; // this means the display list has been altered befre rendering
    +		
    +		batch.remove(displayObject);
    +		
    +		if(batch.size==0)
    +		{
    +			batchToRemove = batch;
    +		}
    +	}
    +	else
    +	{
    +		batchToRemove = displayObject;
    +	}
    +	
    +	/*
    +	 * Looks like there is somthing that needs removing!
    +	 */
    +	if(batchToRemove)	
    +	{
    +		var index = this.batchs.indexOf( batchToRemove );
    +		if(index == -1)return;// this means it was added then removed before rendered
    +		
    +		// ok so.. check to see if you adjacent batchs should be joined.
    +		// TODO may optimise?
    +		if(index == 0 || index == this.batchs.length-1)
    +		{
    +			// wha - eva! just get of the empty batch!
    +			this.batchs.splice(index, 1);
    +			if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +		
    +			return;
    +		}
    +		
    +		if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch)
    +		{
    +			if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode)
    +			{
    +				//console.log("MERGE")
    +				this.batchs[index-1].merge(this.batchs[index+1]);
    +				
    +				if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +				PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]);
    +				this.batchs.splice(index, 2);
    +				return;
    +			}
    +		}
    +		
    +		
    +		this.batchs.splice(index, 1);
    +		if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove);
    +	}
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject)
    +{
    +	// TODO - this can be faster - but not as important right now
    +	if(displayObject.__renderGroup != this)return;
    +	
    +	this.removeDisplayObject(displayObject);
    +	var children = displayObject.children;
    +	
    +	for (var i=0; i < children.length; i++) 
    +	{
    +	  	this.removeDisplayObjectAndChildren(children[i]);
    +	};
    +}
    +
    +/**
    + * @private
    + */
    +
    +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE NEXT SPRITE
    +	 *  This part looks for the closest next sprite that can go into a batch
    +	 *  it keeps looking until it finds a sprite or gets to the end of the display
    +	 *  scene graph
    +	 * 
    +	 *  These look a lot scarier than the actually are...
    +	 */
    +	
    +	var nextSprite = displayObject;
    +	do
    +	{
    +		// moving forward!
    +		// if it has no children.. 
    +		if(nextSprite.children.length == 0)
    +		{
    +			// go along to the parent..
    +			while(nextSprite.childIndex == nextSprite.parent.children.length-1)
    +			{
    +				nextSprite = nextSprite.parent;
    +				if(nextSprite ==  this.root)//displayObject.stage)
    +				{
    +					nextSprite = null
    +					break;
    +				}
    +			}
    +			
    +			if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1];
    +		}
    +		else
    +		{
    +			nextSprite = nextSprite.children[0];
    +		}
    +
    +		if(!nextSprite)break;
    +	}
    +	while(!nextSprite.renderable || !nextSprite.__renderGroup)
    +	
    +	return nextSprite;
    +}
    +
    +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject)
    +{
    +	/*
    +	 *  LOOK FOR THE PREVIOUS SPRITE
    +	 *  This part looks for the closest previous sprite that can go into a batch
    +	 *  It keeps going back until it finds a sprite or the stage
    +	 */
    +	var previousSprite = displayObject;
    +	do
    +	{
    +		if(previousSprite.childIndex == 0)
    +		{
    +			previousSprite = previousSprite.parent;
    +			
    +		}
    +		else
    +		{
    +			
    +			previousSprite = previousSprite.parent.children[previousSprite.childIndex-1];
    +			// what if the bloop has children???
    +			while(previousSprite.children.length != 0)
    +			{
    +				// keep diggin till we get to the last child
    +				previousSprite = previousSprite.children[previousSprite.children.length-1];
    +			}
    +		}
    +		
    +		if(previousSprite == this.root)break;
    +	}
    +	while(!previousSprite.renderable || !previousSprite.__renderGroup);
    +	
    +	return previousSprite;
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_renderers_WebGLRenderer.js.html b/docs/files/src_pixi_renderers_WebGLRenderer.js.html index af0ce9f..d670e19 100644 --- a/docs/files/src_pixi_renderers_WebGLRenderer.js.html +++ b/docs/files/src_pixi_renderers_WebGLRenderer.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -134,6 +136,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -171,7 +177,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -186,15 +192,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -203,11 +214,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -218,7 +229,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -264,55 +275,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -327,19 +289,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -349,43 +313,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -427,6 +379,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -464,285 +417,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -774,9 +449,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -863,28 +535,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/docs/files/src_pixi_renderers_WebGLShaders.js.html b/docs/files/src_pixi_renderers_WebGLShaders.js.html index bb52ff9..7154f05 100644 --- a/docs/files/src_pixi_renderers_WebGLShaders.js.html +++ b/docs/files/src_pixi_renderers_WebGLShaders.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_BitmapText.js.html b/docs/files/src_pixi_text_BitmapText.js.html index 9fdae27..a9c3183 100644 --- a/docs/files/src_pixi_text_BitmapText.js.html +++ b/docs/files/src_pixi_text_BitmapText.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_text_Text.js.html b/docs/files/src_pixi_text_Text.js.html index 7933074..b1e0b23 100644 --- a/docs/files/src_pixi_text_Text.js.html +++ b/docs/files/src_pixi_text_Text.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -153,8 +155,8 @@ this.setText(text); this.setStyle(style); - this.updateText(); - this.dirty = false; + //this.updateText(); + this.dirty = true; }; // constructor diff --git a/docs/files/src_pixi_textures_BaseTexture.js.html b/docs/files/src_pixi_textures_BaseTexture.js.html index 31917f0..99afd08 100644 --- a/docs/files/src_pixi_textures_BaseTexture.js.html +++ b/docs/files/src_pixi_textures_BaseTexture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -174,6 +176,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -207,7 +211,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/docs/files/src_pixi_textures_RenderTexture.js.html b/docs/files/src_pixi_textures_RenderTexture.js.html new file mode 100644 index 0000000..27e2284 --- /dev/null +++ b/docs/files/src_pixi_textures_RenderTexture.js.html @@ -0,0 +1,318 @@ + + + + + src/pixi/textures/RenderTexture.js - Pixi.JS + + + + + + + + +
    +
    +
    + +

    + +
    +
    + API Docs for: 1.0.0 +
    +
    +
    + + +
    +
    + Show: + + + + + + + +
    + + +
    +
    +
    +

    File: src/pixi/textures/RenderTexture.js

    + +
    +
    +/**
    + * @author Mat Groves http://matgroves.com/ @Doormat23
    + */
    +
    +/**
    + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. 
    + * @class RenderTexture
    + * @extends Texture
    + * @constructor
    + * @param width {Number}
    + * @param height {Number}
    + */
    +PIXI.RenderTexture = function(width, height)
    +{
    +	PIXI.EventTarget.call( this );
    +	
    +	this.width = width;
    +	this.height = height;
    +	
    +	this.indetityMatrix = PIXI.mat3.create();
    +	
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);	
    +	
    +	if(PIXI.gl)
    +	{
    +		this.initWebGL();
    +	}
    +	else
    +	{
    +		this.initCanvas();
    +	}
    +}
    +
    +PIXI.RenderTexture.constructor = PIXI.RenderTexture;
    +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype );
    +
    +PIXI.RenderTexture.prototype.initWebGL = function()
    +{
    +	var gl = PIXI.gl;
    +	this.glFramebuffer = gl.createFramebuffer();
    +	
    +   	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +
    +    this.glFramebuffer.width = this.width;
    +    this.glFramebuffer.height = this.height;	
    +  
    +	this.baseTexture = new PIXI.BaseTexture();
    +
    +	this.baseTexture.width = this.width;
    +	this.baseTexture.height = this.height;
    +
    +    this.baseTexture._glTexture = gl.createTexture();
    +    gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture);
    +	 	
    +	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA,  this.width,  this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    +	
    +    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    +	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    +	
    +	this.baseTexture.isRender = true;
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0);
    +	
    +	// create a projection matrix..
    +	this.projectionMatrix =  PIXI.mat4.create();
    +	
    +	this.projectionMatrix[5] = 2/this.height// * 0.5;
    +	this.projectionMatrix[13] = -1;
    +	
    +	this.projectionMatrix[0] = 2/this.width;
    +	this.projectionMatrix[12] = -1;
    +
    +	// set the correct render function..
    +	this.render = this.renderWebGL;
    +}
    +
    +PIXI.RenderTexture.prototype.initCanvas = function()
    +{
    +	this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0);
    +	
    +	this.baseTexture = new PIXI.BaseTexture(this.renderer.view);
    +	this.frame = new PIXI.Rectangle(0, 0, this.width, this.height);
    +	
    +	this.render = this.renderCanvas;
    +}
    +
    +/**
    + * This function will draw the display object to the texture.
    + * @method render
    + * @param displayObject {DisplayObject}
    + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn
    + */
    +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear)
    +{
    +	var gl = PIXI.gl;
    +	
    +	// enable the alpha color mask..
    +	gl.colorMask(true, true, true, true); 
    +	
    +	gl.viewport(0, 0, this.width, this.height);	
    +	
    +	gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer );
    +	
    +	if(clear)
    +	{
    +		gl.clearColor(0,0,0, 0);     
    +		gl.clear(gl.COLOR_BUFFER_BIT);
    +	}
    +	
    +	// set the flipped matrix..
    +	gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix);
    +	
    +	// THIS WILL MESS WITH HIT TESTING!
    +	var children = displayObject.children;
    +	
    +	//TODO -? create a new one??? dont think so!
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	var renderGroup = displayObject.__renderGroup ;
    +
    +	if(renderGroup)
    +	{
    +		if(displayObject == renderGroup.root)
    +		{
    +			renderGroup.render();
    +		}
    +		else
    +		{
    +			renderGroup.renderSpecific(displayObject);
    +		}
    +	}
    +	else
    +	{
    +		if(!this.renderGroup)this.renderGroup = new PIXI.WebGLRenderGroup(gl);
    +		this.renderGroup.setRenderable(displayObject);
    +		
    +		this.renderGroup.render();
    +	}
    +	
    +}
    +
    +PIXI.RenderTexture.prototype.renderCanvas = function(displayObject, clear)
    +{
    +	var children = displayObject.children;
    +	
    +	displayObject.worldTransform = this.indetityMatrix;
    +	
    +	for(var i=0,j=children.length; i<j; i++)
    +	{
    +		children[i].updateTransform();	
    +	}
    +	
    +	if(clear)this.renderer.context.clearRect(0,0, this.width, this.height);
    +    this.renderer.renderDisplayObject(displayObject);
    +    
    +    PIXI.texturesToUpdate.push(this.baseTexture);
    +}
    +
    +
    +    
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + diff --git a/docs/files/src_pixi_textures_Texture.js.html b/docs/files/src_pixi_textures_Texture.js.html index ca52cac..b6909f3 100644 --- a/docs/files/src_pixi_textures_Texture.js.html +++ b/docs/files/src_pixi_textures_Texture.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -288,6 +290,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -300,6 +303,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed diff --git a/docs/files/src_pixi_utils_Detector.js.html b/docs/files/src_pixi_utils_Detector.js.html index 62cc770..57bd537 100644 --- a/docs/files/src_pixi_utils_Detector.js.html +++ b/docs/files/src_pixi_utils_Detector.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_EventTarget.js.html b/docs/files/src_pixi_utils_EventTarget.js.html index 7a794c3..a63fde1 100644 --- a/docs/files/src_pixi_utils_EventTarget.js.html +++ b/docs/files/src_pixi_utils_EventTarget.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/files/src_pixi_utils_Utils.js.html b/docs/files/src_pixi_utils_Utils.js.html index e46f12a..f18640b 100644 --- a/docs/files/src_pixi_utils_Utils.js.html +++ b/docs/files/src_pixi_utils_Utils.js.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/index.html b/docs/index.html index f277aae..362bfe7 100644 --- a/docs/index.html +++ b/docs/index.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • diff --git a/docs/modules/PIXI.html b/docs/modules/PIXI.html index d3a42e3..8887003 100644 --- a/docs/modules/PIXI.html +++ b/docs/modules/PIXI.html @@ -67,6 +67,8 @@
  • Rectangle
  • +
  • RenderTexture
  • +
  • Sprite
  • SpriteSheetLoader
  • @@ -233,6 +235,12 @@
  • + + RenderTexture + +
  • + +
  • Sprite diff --git a/examples/example 1 - Basics/pixi.js b/examples/example 1 - Basics/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 1 - Basics/pixi.js +++ b/examples/example 1 - Basics/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i - pixi.js example 3 using a movieclip + pixi.js example 10 using a movieclip + + + + + + + diff --git a/examples/example 3 - MovieClip/pixi.js b/examples/example 3 - MovieClip/pixi.js index 8297a1f..e0418de 100644 --- a/examples/example 3 - MovieClip/pixi.js +++ b/examples/example 3 - MovieClip/pixi.js @@ -4,7 +4,7 @@ * Copyright (c) 2012, Mat Groves * http://goodboydigital.com/ * - * Compiled: 2013-05-06 + * Compiled: 2013-05-22 * * Pixi.JS is licensed under the MIT License. * http://www.opensource.org/licenses/mit-license.php @@ -150,6 +150,13 @@ this.scale = new PIXI.Point(1,1);//{x:1, y:1}; /** + * The pivot point of the displayObject that it rotates around + * @property pivot + * @type Point + */ + this.pivot = new PIXI.Point(0,0); + + /** * The rotation of the object in radians. * @property rotation * @type Number @@ -169,7 +176,7 @@ * @type Boolean */ this.visible = true; - this.cacheVisible = false; + this.worldVisible = false; /** * [read-only] The display object container that contains this display object. @@ -330,9 +337,16 @@ localTransform[4] = this._cr * this.scale.y; ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x; - localTransform[5] = this.position.y; + //localTransform[2] = this.position.x; + //localTransform[5] = this.position.y; + var px = this.pivot.x; + var py = this.pivot.y; + + ///AAARR GETTER SETTTER! + localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; + localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; + // Cache the matrix values (makes for huge speed increases!) var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], @@ -350,7 +364,9 @@ // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + + } /** @@ -390,17 +406,27 @@ { if(child.parent != undefined) { - child.parent.removeChild(child) + child.parent.removeChild(child); } child.parent = this; child.childIndex = this.children.length; this.children.push(child); + if(this.stage) { this.stage.__addChild(child); } + + // need to remove any render groups.. + if(this.__renderGroup) + { + // being used by a renderTexture.. if it exists then it must be from a render texture; + if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); + // add them to the new render group.. + this.__renderGroup.addDisplayObjectAndChildren(child); + } } /** @@ -440,6 +466,12 @@ { this.stage.__addChild(child); } + + // little webGL! + if(this.__renderGroup) + { + this.__renderGroup.addDisplayObjectAndChildren(child); + } } else { @@ -515,12 +547,23 @@ PIXI.DisplayObjectContainer.prototype.removeChild = function(child) { var index = this.children.indexOf( child ); - + if ( index !== -1 ) { - if(this.stage)this.stage.__removeChild(child); + if(this.stage) + { + this.stage.__removeChild(child); + } + // console.log(child.__renderGroup); + if(child.__renderGroup) + { + // console.log(">?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! @@ -1201,7 +1244,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -1315,6 +1358,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -1346,7 +1391,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { @@ -1771,7 +1816,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -1784,6 +1829,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -1856,15 +1902,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -2516,19 +2520,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -2538,43 +2544,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -2616,6 +2610,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -2653,285 +2648,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -2963,9 +2680,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -3052,28 +2766,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } @@ -3636,73 +3347,95 @@ while(displayObject) { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - aX = displayObject.anchor.x - displayObject.texture.trim.x - aY = displayObject.anchor.y - displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; + if(displayObject.worldVisible) + { + width = displayObject.texture.frame.width; + height = displayObject.texture.frame.height; + + // TODO trim?? + aX = displayObject.anchor.x;// - displayObject.texture.trim.x + aY = displayObject.anchor.y; //- displayObject.texture.trim.y + w0 = width * (1-aX); + w1 = width * -aX; + + h0 = height * (1-aY); + h1 = height * -aY; + + index = indexRun * 8; - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; + worldTransform = displayObject.worldTransform; - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; + a = worldTransform[0]; + b = worldTransform[3]; + c = worldTransform[1]; + d = worldTransform[4]; + tx = worldTransform[2]; + ty = worldTransform[5]; - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; + this.verticies[index + 0 ] = a * w1 + c * h1 + tx; + this.verticies[index + 1 ] = d * h1 + b * w1 + ty; + + this.verticies[index + 2 ] = a * w0 + c * h1 + tx; + this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - var texture = displayObject.texture; + this.verticies[index + 4 ] = a * w0 + c * h0 + tx; + this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; + this.verticies[index + 6] = a * w1 + c * h0 + tx; + this.verticies[index + 7] = d * h0 + b * w1 + ty; - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; + if(displayObject.updateFrame || displayObject.texture.updateFrame) + { + this.dirtyUVS = true; + + var texture = displayObject.texture; + + var frame = texture.frame; + var tw = texture.baseTexture.width; + var th = texture.baseTexture.height; + + this.uvs[index + 0] = frame.x / tw; + this.uvs[index +1] = frame.y / th; + + this.uvs[index +2] = (frame.x + frame.width) / tw; + this.uvs[index +3] = frame.y / th; + + this.uvs[index +4] = (frame.x + frame.width) / tw; + this.uvs[index +5] = (frame.y + frame.height) / th; + + this.uvs[index +6] = frame.x / tw; + this.uvs[index +7] = (frame.y + frame.height) / th; + + displayObject.updateFrame = false; + } - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; + // TODO this probably could do with some optimisation.... + if(displayObject.cacheAlpha != displayObject.worldAlpha) + { + displayObject.cacheAlpha = displayObject.worldAlpha; + + var colorIndex = indexRun * 4; + this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; + this.dirtyColors = true; + } } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) + else { - displayObject.cacheAlpha = displayObject.worldAlpha; + index = indexRun * 8; - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; + this.verticies[index + 0 ] = 0; + this.verticies[index + 1 ] = 0; + + this.verticies[index + 2 ] = 0; + this.verticies[index + 3 ] = 0; + + this.verticies[index + 4 ] = 0; + this.verticies[index + 5 ] = 0; + + this.verticies[index + 6] = 0; + this.verticies[index + 7] = 0; } indexRun++; @@ -3714,8 +3447,13 @@ * Draws the batch to the frame buffer * @method render */ -PIXI.WebGLBatch.prototype.render = function() +PIXI.WebGLBatch.prototype.render = function(start, end) { +// console.log(start + " :: " + end + " : " + this.size); + start = start || 0; + //end = end || this.size; + if(end == undefined)end = this.size; + if(this.dirty) { this.refresh(); @@ -3728,16 +3466,10 @@ var gl = this.gl; //TODO optimize this! - if(this.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } + gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); var shaderProgram = PIXI.shaderProgram; + gl.useProgram(shaderProgram); // update the verts.. gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); @@ -3772,9 +3504,570 @@ // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - + + + //var startIndex = 0//1; + var len = end - start; + // console.log(this.size) // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, this.size * 6, gl.UNSIGNED_SHORT, 0); + gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); +} + + +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + + + + +/** + * A WebGLBatch Enables a group of sprites to be drawn using the same settings. + * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. + * @class WebGLBatch + * @param an instance of the webGL context + * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} + */ +PIXI.WebGLRenderGroup = function(gl) +{ + this.gl = gl; + this.root; + + this.backgroundColor; + this.batchs = []; + this.toRemove = []; +} + + +// constructor +PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; + +PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) +{ + // has this changed?? + if(this.root)this.removeDisplayObjectAndChildren(this.root); + + //console.log("!!!"); + // TODO what if its already has an object? should remove it + this.root = displayObject; + //displayObject.__renderGroup = this; + this.addDisplayObjectAndChildren(displayObject); + //displayObject +} + +PIXI.WebGLRenderGroup.prototype.render = function(renderTexture) +{ + + var gl = this.gl; + + for (var i=0; i < this.toRemove.length; i++) + { + this.removeDisplayObjectAndChildren(this.toRemove[i]); + }; + + this.toRemove = []; + + this.checkVisibility(this.root, this.root.visible); + + // will render all the elements in the group + var renderable; + for (var i=0; i < this.batchs.length; i++) + { + renderable = this.batchs[i]; + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + } + +} + +PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, renderTexture) +{ + var gl = this.gl; + this.checkVisibility(displayObject, displayObject.visible); + + + //console.log("SPECIFIC"); + // to do! + // render part of the scene... + + var startIndex; + var startBatchIndex; + + var endIndex; + var endBatchIndex; + + // get NEXT Renderable! + var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); + var startBatch = nextRenderable.batch; + + if(nextRenderable instanceof PIXI.Sprite) + { + startBatch = nextRenderable.batch; + + var head = startBatch.head; + var next = head; + + // ok now we have the batch.. need to find the start index! + if(head == nextRenderable) + { + startIndex = 0; + } + else + { + startIndex = 1; + + while(head.__next != nextRenderable) + { + startIndex++; + head = head.__next; + } + } + } + else + { + startBatch = nextRenderable; + } + + // Get the LAST renderable object + var lastRenderable = displayObject; + var endBatch; + var lastItem = displayObject; + while(lastItem.children.length > 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; } @@ -3859,14 +4152,12 @@ PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; - this.context.setTransform(1,0,0,1,0,0); stage.updateTransform(); - - this.context.setTransform(1,0,0,1,0,0); // update the background color if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; + this.context.setTransform(1,0,0,1,0,0); this.context.clearRect(0, 0, this.width, this.height) this.renderDisplayObject(stage); //as @@ -3910,7 +4201,7 @@ { var transform = displayObject.worldTransform; var context = this.context; - context.globalCompositeOperation = "source-over" + //context.globalCompositeOperation = "source-over" var blit = false; if(!displayObject.visible)return; @@ -3947,14 +4238,18 @@ else {*/ blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) + context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); + context.drawImage(displayObject.texture.baseTexture.source, frame.x, frame.y, frame.width, frame.height, - (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + (displayObject.anchor.x) * -frame.width, + (displayObject.anchor.y) * -frame.height, + // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, + // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, + frame.width, frame.height); //} @@ -3977,7 +4272,7 @@ this.renderDisplayObject(displayObject.children[i]); } - + this.context.setTransform(1,0,0,1,0,0); } /** @@ -4484,6 +4779,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -4517,7 +4814,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } @@ -4726,6 +5022,7 @@ /** * * Adds a texture to the textureCache. + * @static * @method addTextureToCache * @param texture {Texture} * @param id {String} the id that the texture will be stored against. @@ -4738,6 +5035,7 @@ /** * * Remove a texture from the textureCache. + * @static * @method removeTextureFromCache * @param id {String} the id of the texture to be removed * @return {Texture} the texture that was removed @@ -4758,6 +5056,173 @@ */ /** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i?") + child.__renderGroup.removeDisplayObjectAndChildren(child); + } + + // console.log(">" + child.__renderGroup) child.parent = undefined; - //child.childIndex = 0 + this.children.splice( index, 1 ); // update in dexs! diff --git a/src/pixi/InteractionManager.js b/src/pixi/InteractionManager.js index 58bb5fc..ad264bd 100644 --- a/src/pixi/InteractionManager.js +++ b/src/pixi/InteractionManager.js @@ -5,7 +5,7 @@ /** -The interaction manager deals with mouse and touch events. At this moment only Sprite's can be interactive. +The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive This manager also supports multitouch. @class InteractionManager @constructor @@ -119,6 +119,8 @@ PIXI.InteractionManager.prototype.update = function() { + if(!this.target)return; + // frequency of 30fps?? var now = Date.now(); var diff = now - this.last; @@ -150,7 +152,7 @@ // loop through interactive objects! var length = this.interactiveItems.length; - if(this.target)this.target.view.style.cursor = "default"; + this.target.view.style.cursor = "default"; for (var i = 0; i < length; i++) { diff --git a/src/pixi/Stage.js b/src/pixi/Stage.js index 2562054..0db5d52 100644 --- a/src/pixi/Stage.js +++ b/src/pixi/Stage.js @@ -14,7 +14,7 @@ { PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create()//.//identity(); + this.worldTransform = PIXI.mat3.create() this.__childrenAdded = []; this.__childrenRemoved = []; this.childIndex = 0; @@ -27,6 +27,7 @@ this.interactionManager = new PIXI.InteractionManager(this); this.setBackgroundColor(backgroundColor); + this.worldVisible = true; } // constructor @@ -99,15 +100,13 @@ { if(child.interactive)this.dirty = true; - this.__childrenRemoved.push(child); - child.stage = undefined; if(child.children) { for(var i=0,j=child.children.length; i 0) + { + lastItem = lastItem.children[lastItem.children.length-1]; + if(lastItem.renderable)lastRenderable = lastItem; + } + + if(lastRenderable instanceof PIXI.Sprite) + { + endBatch = lastRenderable.batch; + + var head = endBatch.head; + + if(head == lastRenderable) + { + endIndex = 0; + } + else + { + endIndex = 1; + + while(head.__next != lastRenderable) + { + endIndex++; + head = head.__next; + } + } + } + else + { + endBatch = lastRenderable; + } + + // now we have first and last! + startBatchIndex = this.batchs.indexOf(startBatch); + endBatchIndex = this.batchs.indexOf(endBatch); + + // DO the first batch + if(startBatch instanceof PIXI.WebGLBatch) + { + startBatch.render(startIndex); + } + else if(startBatch instanceof PIXI.TilingSprite) + { + if(startBatch.visible)this.renderTilingSprite(startBatch); + } + else if(startBatch instanceof PIXI.Strip) + { + if(startBatch.visible)this.renderStrip(startBatch); + } + + // DO the middle batchs.. + for (var i=startBatchIndex+1; i < endBatchIndex; i++) + { + renderable = this.batchs[i]; + + if(renderable instanceof PIXI.WebGLBatch) + { + this.batchs[i].render(); + } + else if(renderable instanceof PIXI.TilingSprite) + { + if(renderable.visible)this.renderTilingSprite(renderable); + } + else if(renderable instanceof PIXI.Strip) + { + if(renderable.visible)this.renderStrip(renderable); + } + + } + + // DO the last batch.. + if(endBatch instanceof PIXI.WebGLBatch) + { + endBatch.render(0, endIndex+1); + } + else if(endBatch instanceof PIXI.TilingSprite) + { + if(endBatch.visible)this.renderTilingSprite(endBatch); + } + else if(endBatch instanceof PIXI.Strip) + { + if(endBatch.visible)this.renderStrip(endBatch); + } +} + +PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) +{ + // give the dp a refference to its renderGroup... + var children = displayObject.children; + //displayObject.worldVisible = globalVisible; + for (var i=0; i < children.length; i++) + { + var child = children[i]; + + // TODO optimize... shouldt need to loop through everything all the time + child.worldVisible = child.visible && globalVisible; + + // everything should have a batch! + // time to see whats new! + if(child.textureChange) + { + child.textureChange = false; + if(child.worldVisible) + { + this.removeDisplayObject(child) + this.addDisplayObject(child) + } + // update texture!! + } + + if(child.children.length > 0) + { + this.checkVisibility(child, child.worldVisible); + } + }; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) +{ + // add a child to the render group.. + displayObject.batch = null; + displayObject.__renderGroup = this; + + //displayObject.cacheVisible = true; + if(!displayObject.renderable)return; + + // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED + //displayObject.__inWebGL = true; + + var previousSprite = this.getPreviousRenderable(displayObject); + var nextSprite = this.getNextRenderable(displayObject); + + + /* + * so now we have the next renderable and the previous renderable + * + */ + + if(displayObject instanceof PIXI.Sprite) + { + var previousBatch + var nextBatch + + //console.log( previousSprite) + if(previousSprite instanceof PIXI.Sprite) + { + previousBatch = previousSprite.batch; + if(previousBatch) + { + if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) + { + previousBatch.insertAfter(displayObject, previousSprite); + return; + } + } + } + else + { + // TODO reword! + previousBatch = previousSprite; + } + + if(nextSprite) + { + if(nextSprite instanceof PIXI.Sprite) + { + nextBatch = nextSprite.batch; + + //batch may not exist if item was added to the display list but not to the webGL + if(nextBatch) + { + if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) + { + nextBatch.insertBefore(displayObject, nextSprite); + return; + } + else + { + if(nextBatch == previousBatch) + { + // THERE IS A SPLIT IN THIS BATCH! // + var splitBatch = previousBatch.split(nextSprite); + // COOL! + // add it back into the array + /* + * OOPS! + * seems the new sprite is in the middle of a batch + * lets split it.. + */ + var batch = PIXI.WebGLRenderer.getBatch(); + + var index = this.batchs.indexOf( previousBatch ); + batch.init(displayObject); + this.batchs.splice(index+1, 0, batch, splitBatch); + + return; + } + } + } + } + else + { + // TODO re-word! + nextBatch = nextSprite; + } + } + + /* + * looks like it does not belong to any batch! + * but is also not intersecting one.. + * time to create anew one! + */ + + var batch = PIXI.WebGLRenderer.getBatch(); + batch.init(displayObject); + + if(previousBatch) // if this is invalid it means + { + var index = this.batchs.indexOf( previousBatch ); + this.batchs.splice(index+1, 0, batch); + } + else + { + this.batchs.push(batch); + } + + } + else if(displayObject instanceof PIXI.TilingSprite) + { + // add to a batch!! + this.initTilingSprite(displayObject); + this.batchs.push(displayObject); + + } + else if(displayObject instanceof PIXI.Strip) + { + // add to a batch!! + this.initStrip(displayObject); + this.batchs.push(displayObject); + } + + // if its somthing else... then custom codes! + this.batchUpdate = true; +} + +PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + + this.addDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.addDisplayObjectAndChildren(children[i]); + }; +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) +{ + // loop through children.. + // display object // + + // add a child from the render group.. + // remove it and all its children! + //displayObject.cacheVisible = false;//displayObject.visible; + displayObject.__renderGroup = null; + + if(!displayObject.renderable)return; + + /* + * removing is a lot quicker.. + * + */ + var batchToRemove; + + if(displayObject instanceof PIXI.Sprite) + { + // should always have a batch! + var batch = displayObject.batch; + if(!batch)return; // this means the display list has been altered befre rendering + + batch.remove(displayObject); + + if(batch.size==0) + { + batchToRemove = batch; + } + } + else + { + batchToRemove = displayObject; + } + + /* + * Looks like there is somthing that needs removing! + */ + if(batchToRemove) + { + var index = this.batchs.indexOf( batchToRemove ); + if(index == -1)return;// this means it was added then removed before rendered + + // ok so.. check to see if you adjacent batchs should be joined. + // TODO may optimise? + if(index == 0 || index == this.batchs.length-1) + { + // wha - eva! just get of the empty batch! + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + + return; + } + + if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) + { + if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) + { + //console.log("MERGE") + this.batchs[index-1].merge(this.batchs[index+1]); + + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); + this.batchs.splice(index, 2); + return; + } + } + + + this.batchs.splice(index, 1); + if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); + } +} + +PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) +{ + // TODO - this can be faster - but not as important right now + if(displayObject.__renderGroup != this)return; + + this.removeDisplayObject(displayObject); + var children = displayObject.children; + + for (var i=0; i < children.length; i++) + { + this.removeDisplayObjectAndChildren(children[i]); + }; +} + +/** + * @private + */ + +PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) +{ + /* + * LOOK FOR THE NEXT SPRITE + * This part looks for the closest next sprite that can go into a batch + * it keeps looking until it finds a sprite or gets to the end of the display + * scene graph + * + * These look a lot scarier than the actually are... + */ + + var nextSprite = displayObject; + do + { + // moving forward! + // if it has no children.. + if(nextSprite.children.length == 0) + { + // go along to the parent.. + while(nextSprite.childIndex == nextSprite.parent.children.length-1) + { + nextSprite = nextSprite.parent; + if(nextSprite == this.root)//displayObject.stage) + { + nextSprite = null + break; + } + } + + if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; + } + else + { + nextSprite = nextSprite.children[0]; + } + + if(!nextSprite)break; + } + while(!nextSprite.renderable || !nextSprite.__renderGroup) + + return nextSprite; +} + +PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) +{ + /* + * LOOK FOR THE PREVIOUS SPRITE + * This part looks for the closest previous sprite that can go into a batch + * It keeps going back until it finds a sprite or the stage + */ + var previousSprite = displayObject; + do + { + if(previousSprite.childIndex == 0) + { + previousSprite = previousSprite.parent; + + } + else + { + + previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; + // what if the bloop has children??? + while(previousSprite.children.length != 0) + { + // keep diggin till we get to the last child + previousSprite = previousSprite.children[previousSprite.children.length-1]; + } + } + + if(previousSprite == this.root)break; + } + while(!previousSprite.renderable || !previousSprite.__renderGroup); + + return previousSprite; +} + diff --git a/src/pixi/renderers/WebGLRenderer.js b/src/pixi/renderers/WebGLRenderer.js index 2089718..95d12c1 100644 --- a/src/pixi/renderers/WebGLRenderer.js +++ b/src/pixi/renderers/WebGLRenderer.js @@ -4,6 +4,10 @@ PIXI._defaultFrame = new PIXI.Rectangle(0,0,1,1); +// an instance of the gl context.. +// only one at the moment :/ +PIXI.gl; + /** * the WebGLRenderer is draws the stage and all its content onto a webGL enabled canvas. This renderer should be used for browsers support webGL. This Render works by automatically managing webGLBatchs. So no need for Sprite Batch's or Sprite Cloud's * Dont forget to add the view to your DOM or you will not see anything :) @@ -41,7 +45,7 @@ try { - this.gl = this.view.getContext("experimental-webgl", { + PIXI.gl = this.gl = this.view.getContext("experimental-webgl", { alpha: this.transparent, antialias:false, // SPEED UP?? premultipliedAlpha:true @@ -56,15 +60,20 @@ var gl = this.gl; + PIXI.WebGLRenderer.gl = gl; this.batch = new PIXI.WebGLBatch(gl); gl.disable(gl.DEPTH_TEST); + gl.disable(gl.CULL_FACE); gl.enable(gl.BLEND); gl.colorMask(true, true, true, this.transparent); this.projectionMatrix = PIXI.mat4.create(); this.resize(this.width, this.height) this.contextLost = false; + + this.stageRenderGroup = new PIXI.WebGLRenderGroup(this.gl); + } // constructor @@ -73,11 +82,11 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.getBatch = function() +PIXI.WebGLRenderer.getBatch = function() { if(PIXI._batchs.length == 0) { - return new PIXI.WebGLBatch(this.gl); + return new PIXI.WebGLBatch(PIXI.WebGLRenderer.gl); } else { @@ -88,7 +97,7 @@ /** * @private */ -PIXI.WebGLRenderer.prototype.returnBatch = function(batch) +PIXI.WebGLRenderer.returnBatch = function(batch) { batch.clean(); PIXI._batchs.push(batch); @@ -134,55 +143,6 @@ PIXI.shaderProgram = this.shaderProgram; } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.checkVisibility = function(displayObject, globalVisible) -{ - var children = displayObject.children; - - - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - var actualVisibility = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(actualVisibility) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.cacheVisible != actualVisibility) - { - child.cacheVisible = actualVisibility; - - if(child.cacheVisible) - { - this.addDisplayObject(child); - } - else - { - this.removeDisplayObject(child); - } - } - - if(child.children.length > 0) - { - this.checkVisibility(child, actualVisibility); - } - }; -} - /** * Renders the stage to its webGL view @@ -197,19 +157,21 @@ // if rendering a new stage clear the batchs.. if(this.__stage !== stage) { + // TODO make this work if(this.__stage)this.checkVisibility(this.__stage, false) this.__stage = stage; + this.stageRenderGroup.setRenderable(stage); } + // update children if need be // best to remove first! for (var i=0; i < stage.__childrenRemoved.length; i++) { - this.removeDisplayObject(stage.__childrenRemoved[i]); + var group = stage.__childrenRemoved[i].__renderGroup + if(group)group.removeDisplayObject(stage.__childrenRemoved[i]); } - - // update any textures for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); @@ -219,43 +181,31 @@ stage.__childrenAdded = []; PIXI.texturesToUpdate = []; PIXI.texturesToDestroy = []; + // recursivly loop through all items! - this.checkVisibility(stage, true); + //this.checkVisibility(stage, true); // update the scene graph stage.updateTransform(); var gl = this.gl; - gl.clear(gl.COLOR_BUFFER_BIT) - - gl.clearColor(stage.backgroundColorSplit[0], stage.backgroundColorSplit[1], stage.backgroundColorSplit[2], 0); + // -- Does this need to be set every frame? -- // + gl.colorMask(true, true, true, this.transparent); + gl.viewport(0, 0, this.width, this.height); - - // set the correct blend mode! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); + // set the correct matrix.. gl.uniformMatrix4fv(this.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + gl.bindFramebuffer(gl.FRAMEBUFFER, null); + + gl.clearColor(stage.backgroundColorSplit[0],stage.backgroundColorSplit[1],stage.backgroundColorSplit[2], this.transparent); + gl.clear(gl.COLOR_BUFFER_BIT); + + // render all the batchs! - - - var renderable; - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable); - } - } + this.stageRenderGroup.backgroundColor = stage.backgroundColorSplit; + this.stageRenderGroup.render(); // interaction // run interaction! @@ -297,6 +247,7 @@ { gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); @@ -334,285 +285,7 @@ } } -/** - * @private - */ -PIXI.WebGLRenderer.prototype.addDisplayObject = function(displayObject) -{ - var objectDetaildisplayObject - if(!displayObject.stage)return; // means it was removed - if(displayObject.__inWebGL)return; //means it is already in webgL - - //displayObject.cacheVisible = displayObject.visible; - - // TODO if objects parent is not visible then dont add to stage!!!! - //if(!displayObject.visible)return; - - displayObject.batch = null; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - displayObject.__inWebGL = true; - - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - - } - else - { - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == displayObject.stage)break; - } - while(!previousSprite.renderable || !previousSprite.__inWebGL) - //while(!(previousSprite instanceof PIXI.Sprite)) - - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - if(nextSprite == displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__inWebGL) - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = this.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = this.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.removeDisplayObject = function(displayObject) -{ - //if(displayObject.stage)return; - displayObject.cacheVisible = false;//displayObject.visible; - - if(!displayObject.renderable)return; - - displayObject.__inWebGL = false; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - this.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)this.returnBatch(batchToRemove); - } - - -} /** * resizes the webGL view to the specified width and height @@ -644,9 +317,6 @@ */ PIXI.WebGLRenderer.prototype.initTilingSprite = function(sprite) { - - - var gl = this.gl; // make the texture tilable.. @@ -733,28 +403,25 @@ var offsetX = tilePosition.x/sprite.texture.baseTexture.width; var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x///sprite.texture.baseTexture.width; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y///sprite.texture.baseTexture.height; - // - //sprite.dirty = true; - sprite.uvs[0] = 0 + offsetX + var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; + var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; + + sprite.uvs[0] = 0 - offsetX; sprite.uvs[1] = 0 - offsetY; - sprite.uvs[2] = (1 * scaleX) +offsetX + sprite.uvs[2] = (1 * scaleX) -offsetX; sprite.uvs[3] = 0 - offsetY; - sprite.uvs[4] = (1 *scaleX) + offsetX + sprite.uvs[4] = (1 *scaleX) - offsetX; sprite.uvs[5] = (1 *scaleY) - offsetY; - sprite.uvs[6] = 0 + offsetX + sprite.uvs[6] = 0 - offsetX; sprite.uvs[7] = (1 *scaleY) - offsetY; - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) this.renderStrip(sprite); - } diff --git a/src/pixi/textures/BaseTexture.js b/src/pixi/textures/BaseTexture.js index 763c49f..c007299 100644 --- a/src/pixi/textures/BaseTexture.js +++ b/src/pixi/textures/BaseTexture.js @@ -44,6 +44,8 @@ */ this.source = source//new Image(); + if(!source)return; + if(this.source instanceof Image) { if(this.source.complete) @@ -77,7 +79,6 @@ this.width = this.source.width; this.height = this.source.height; - //console.log(">!!",this.width) PIXI.texturesToUpdate.push(this); } diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js new file mode 100644 index 0000000..f87aa73 --- /dev/null +++ b/src/pixi/textures/RenderTexture.js @@ -0,0 +1,166 @@ +/** + * @author Mat Groves http://matgroves.com/ @Doormat23 + */ + +/** + * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. + * @class RenderTexture + * @extends Texture + * @constructor + * @param width {Number} + * @param height {Number} + */ +PIXI.RenderTexture = function(width, height) +{ + PIXI.EventTarget.call( this ); + + this.width = width; + this.height = height; + + this.indetityMatrix = PIXI.mat3.create(); + + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + if(PIXI.gl) + { + this.initWebGL(); + } + else + { + this.initCanvas(); + } +} + +PIXI.RenderTexture.constructor = PIXI.RenderTexture; +PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); + +PIXI.RenderTexture.prototype.initWebGL = function() +{ + var gl = PIXI.gl; + this.glFramebuffer = gl.createFramebuffer(); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + this.glFramebuffer.width = this.width; + this.glFramebuffer.height = this.height; + + this.baseTexture = new PIXI.BaseTexture(); + + this.baseTexture.width = this.width; + this.baseTexture.height = this.height; + + this.baseTexture._glTexture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + + this.baseTexture.isRender = true; + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); + + // create a projection matrix.. + this.projectionMatrix = PIXI.mat4.create(); + + this.projectionMatrix[5] = 2/this.height// * 0.5; + this.projectionMatrix[13] = -1; + + this.projectionMatrix[0] = 2/this.width; + this.projectionMatrix[12] = -1; + + // set the correct render function.. + this.render = this.renderWebGL; +} + +PIXI.RenderTexture.prototype.initCanvas = function() +{ + this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); + + this.baseTexture = new PIXI.BaseTexture(this.renderer.view); + this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); + + this.render = this.renderCanvas; +} + +/** + * This function will draw the display object to the texture. + * @method render + * @param displayObject {DisplayObject} + * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn + */ +PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) +{ + var gl = PIXI.gl; + + // enable the alpha color mask.. + gl.colorMask(true, true, true, true); + + gl.viewport(0, 0, this.width, this.height); + + gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); + + if(clear) + { + gl.clearColor(0,0,0, 0); + gl.clear(gl.COLOR_BUFFER_BIT); + } + + // set the flipped matrix.. + gl.uniformMatrix4fv(renderer.shaderProgram.mvMatrixUniform, false, this.projectionMatrix); + + // THIS WILL MESS WITH HIT TESTING! + var children = displayObject.children; + + //TODO -? create a new one??? dont think so! + displayObject.worldTransform = this.indetityMatrix; + + for(var i=0,j=children.length; i